Importing Modules

  • PyObject * PyImport_ImportModule(const char ** name *)
    • 返回值:新参考.

这是下面PyImport_ImportModuleEx()的简化接口,将* globals locals 参数设置为 NULL level 设置为 0. name 参数包含点时(当它指定包的子模块时) ),将 fromlist 参数设置为列表['*'],以便返回值是命名模块,而不是包含它的顶级包。 (不幸的是,当 name 实际上指定了子包而不是子模块时,这会产生额外的副作用:加载包__all__变量中指定的子模块.)返回对导入模块的新引用,或者返回 NULL *并带有一个失败时设置的异常。在 Python 2.4 之前,如果遇到故障,仍可以创建该模块-检查sys.modules找出答案。从 Python 2.4 开始,模块导入失败将不再将模块留在sys.modules中。

在版本 2.4 中进行了更改:导入失败会删除不完整的模块对象。

在 2.6 版中更改:始终使用绝对导入。

2.6 版的新Function。

导入模块。最好pass参考内置的 Python 函数import()来描述,因为标准import()函数直接调用此函数。

返回值是对导入的模块或顶级包或* NULL 的新引用,并带有针对失败设置的异常(在 Python 2.4 之前,在这种情况下仍可以创建该模块)。就像import()一样,当请求包的子模块时,返回值通常是顶级包,除非给出了非空的 fromlist *。

在版本 2.4 中进行了更改:导入失败会删除不完整的模块对象。

在 2.6 版中进行了更改:该函数是PyImport_ImportModuleLevel()的别名,级别为-1,表示相对导入。

导入模块。最好pass参考内置的 Python 函数import()来描述,因为标准import()函数直接调用此函数。

返回值是对导入的模块或顶级程序包的新引用,或者是* NULL (在失败时设置了 exception)。就像import()一样,当请求包的子模块时,返回值通常是顶级包,除非给出了非空的 fromlist *。

2.5 版的新Function。

这是一个高级接口,它调用当前的“导入钩子函数”。它从当前全局变量的__builtins__调用import()函数。这意味着可以使用当前环境中安装的任何导入钩子来完成导入。passrexecihooks

在 2.6 版中更改:始终使用绝对导入。

重新加载模块。最好pass参考内置的 Python 函数reload()来描述,因为标准reload()函数直接调用此函数。返回对重新加载的模块的新引用,或者返回* NULL *,并在失败时设置异常(在这种情况下该模块仍然存在)。

  • PyObject * PyImport_AddModule(const char ** name *)
    • *返回值:借用参考。

返回与模块名称相对应的模块对象。 * name 参数的形式可以为package.module。首先检查模块词典中是否有模块词典,如果没有,则创建一个新的模块并将其插入模块词典中。返回 NULL *,并在失败时设置异常。

Note

此Function不会加载或导入模块;如果尚未加载模块,则将获得一个空的模块对象。使用PyImport_ImportModule()或其变体之一来导入模块。如果名称不存在,则不会创建点名称*所暗示的包结构。

  • PyObject * PyImport_ExecCodeModule(char *name PyObject co *)
    • 返回值:新参考.

给定模块名称(可能是package.module的形式)和从 Python 字节码文件读取或从内置函数compile()获得的代码对象,加载模块。返回对模块对象的新引用;如果发生错误,则返回* NULL 并设置一个异常。在 Python 2.4 之前,仍然可以在错误情况下创建该模块。从 Python 2.4 开始,在错误情况下,即使在 ImportingPyImport_ExecCodeModule() name 已经在sys.modules中,也会从sys.modules中删除 name *。将未完全初始化的模块留在sys.modules中是危险的,因为此类模块的导入无法知道模块对象是未知状态(并且就模块作者的意图而言可能已损坏)。

模块的__file__属性将设置为代码对象的co_filename

如果模块已经导入,则此Function将重新加载该模块。有关重新加载模块的预期方法,请参见PyImport_ReloadModule()

如果* name *指向格式为package.module的点名,则仍不会创建任何尚未创建的包结构。

在版本 2.4 中进行了更改:在错误情况下,* name *从sys.modules中删除。

  • PyObject * PyImport_ExecCodeModuleEx(char *name PyObject co *,char ** pathname *)
    • 返回值:新参考.

类似于PyImport_ExecCodeModule(),但是如果模块对象的__file__属性不是NULL,则设置为* pathname *。

  • PyImport_GetMagicNumber()

    • 返回 Python 字节码文件(也就是.pyc.pyo文件)的幻数。幻数应该以小尾数字节 Sequences 出现在字节码文件的前四个字节中。
  • PyObject* PyImport_GetModuleDict ( )

    • *返回值:借用参考。

返回用于模块 Management 的字典(也称为sys.modules)。请注意,这是每个解释器变量。

  • PyObject * PyImport_GetImporter(PyObject ** path *)
    • 返回sys.path/pkg.__path__项* path *的导入器对象,可能是从sys.path_importer_cache字典中获取的。如果尚未缓存,请遍历sys.path_hooks直到找到可以处理路径项的钩子。如果没有钩子,则返回None;否则返回 0.这告诉我们的调用者应该退回到内置的导入机制。将结果缓存在sys.path_importer_cache中。返回对导入器对象的新引用。

2.6 版的新Function。

  • 无效_PyImport_Init()

    • 初始化导入机制。仅限内部使用。
  • 无效PyImport_Cleanup()

    • 清空模块表。仅限内部使用。
  • 无效_PyImport_Fini()

    • finally确定导入机制。仅限内部使用。
  • PyObject * _PyImport_FindExtension(char *,char *)

    • 仅限内部使用。
  • PyObject * _PyImport_FixupExtension(char *,char *)

    • 仅限内部使用。
  • int PyImport_ImportFrozenModule(char ** name *)

    • 加载名为* name *的冻结模块。如果成功返回1,如果找不到该模块则返回0,如果初始化失败则返回-1并设置一个异常。要成功加载导入的模块,请使用PyImport_ImportModule()。 (请注意使用错误的名称-如果该函数已经导入,则它将重新加载该模块.)
  • 结构_frozen

    • 这是冻结模块 Descriptors 的结构类型定义,由 freeze Util 生成(请参见 Python 源代码发布中的Tools/freeze/)。在Include/import.h中找到的定义是:
struct _frozen {
    char *name;
    unsigned char *code;
    int size;
};
  • 结构_frozen * PyImport_FrozenModules

    • 该指针被初始化为指向struct _frozen个记录的数组,并以一个其成员均为* NULL *或零的成员终止。导入冻结的模块后,将在此表中对其进行搜索。第三方代码可以以此来提供动态创建的冻结模块集合。
  • int PyImport_AppendInittab(const char *name ,void( initfunc *)(void))

    • 将单个模块添加到现有内置模块表中。这是围绕PyImport_ExtendInittab()的便捷包装,如果无法扩展表,则返回-1。可以使用名称* name 导入新模块,并使用函数 initfunc *作为首次try导入时调用的初始化函数。应该在Py_Initialize()之前调用。
  • 结构_inittab

    • 描述内置模块列表中单个条目的结构。这些结构中的每一个都为解释器中内置的模块提供名称和初始化Function。嵌入 Python 的程序可以将这些结构的数组与PyImport_ExtendInittab()结合使用,以提供其他内置模块。该结构在Include/import.h中定义为:
struct _inittab {
    char *name;
    void (*initfunc)(void);
};
  • int PyImport_ExtendInittab(结构_inittab ** newtab *)
    • 将模块集合添加到内置模块表中。 * newtab 数组必须以哨兵条目结尾,该条目包含name字段的 NULL *;无法提供前哨值可能会导致内存故障。如果成功分配了不足的内存来扩展内部表,则返回0成功或-1。发生故障时,不会将任何模块添加到内部表中。这应该在Py_Initialize()之前调用。