导入模块

PyObject *PyImport_ImportModule(const char *name)
返回值:新的引用。 稳定 ABI 的一部分。

这是 PyImport_Import() 的包装器,它接受一个 const char* 作为参数,而不是 PyObject*

PyObject *PyImport_ImportModuleNoBlock(const char *name)
返回值:新的引用。 稳定 ABI 的一部分。

此函数是 PyImport_ImportModule() 的已弃用别名。

在 3.3 版本中更改: 此函数在导入锁被另一个线程持有时会立即失败。但在 Python 3.3 中,锁定方案切换为大多数情况下每个模块锁定,因此不再需要此函数的特殊行为。

自 3.13 版本弃用,将在 3.15 版本中删除: 请改用 PyImport_ImportModule()

PyObject *PyImport_ImportModuleEx(const char *name, PyObject *globals, PyObject *locals, PyObject *fromlist)
返回值:新的引用。

导入一个模块。最好参考内置 Python 函数 __import__() 来描述此函数。

返回值是对导入的模块或顶层包的新引用,或者在失败时返回 NULL 并设置异常。与 __import__() 一样,当请求包的子模块时,返回值通常是顶层包,除非给定了非空的 *fromlist*。

失败的导入会删除不完整的模块对象,就像 PyImport_ImportModule() 一样。

PyObject *PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)
返回值:新的引用。 自 3.7 版本起成为 稳定 ABI 的一部分。

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

返回值是对导入的模块或顶层包的新引用,或者在失败时返回 NULL 并设置异常。与 __import__() 一样,当请求包的子模块时,返回值通常是顶层包,除非给定了非空的 *fromlist*。

在 3.3 版本中添加。

PyObject *PyImport_ImportModuleLevel(const char *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)
返回值:新的引用。 稳定 ABI 的一部分。

类似于 PyImport_ImportModuleLevelObject(),但名称是 UTF-8 编码的字符串,而不是 Unicode 对象。

在 3.3 版本中更改: 不再接受 *level* 的负值。

PyObject *PyImport_Import(PyObject *name)
返回值:新的引用。 稳定 ABI 的一部分。

这是一个更高级的接口,它调用当前的“导入钩子函数”(显式的 *level* 为 0,表示绝对导入)。它调用当前全局变量的 __builtins__ 中的 __import__() 函数。这意味着导入是使用当前环境中安装的任何导入钩子完成的。

此函数始终使用绝对导入。

PyObject *PyImport_ReloadModule(PyObject *m)
返回值:新的引用。 稳定 ABI 的一部分。

重新加载一个模块。返回对重新加载的模块的新引用,或者在失败时返回 NULL 并设置异常(在这种情况下,模块仍然存在)。

PyObject *PyImport_AddModuleRef(const char *name)
返回值:新的引用。 自 3.13 版本起成为 稳定 ABI 的一部分。

返回与模块名称对应的模块对象。

name 参数的形式可以是 package.module。首先检查模块字典中是否有一个,如果没有,则创建一个新的并将其插入模块字典中。

成功时返回对模块的强引用。在失败时返回 NULL 并设置异常。

模块名称 *name* 是从 UTF-8 解码的。

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

在 3.13 版本中添加。

PyObject *PyImport_AddModuleObject(PyObject *name)
返回值:借用引用。 自 3.7 版本起成为 稳定 ABI 的一部分。

类似于 PyImport_AddModuleRef(),但是返回一个借用引用,并且 name 是一个 Python str 对象。

在 3.3 版本中添加。

PyObject *PyImport_AddModule(const char *name)
返回值:借用引用。稳定 ABI 的一部分。

类似于 PyImport_AddModuleRef(),但是返回一个借用引用

PyObject *PyImport_ExecCodeModule(const char *name, PyObject *co)
返回值:新的引用。 稳定 ABI 的一部分。

给定一个模块名称(可能采用 package.module 的形式)和一个从 Python 字节码文件读取或从内置函数 compile() 获取的代码对象,加载该模块。返回对模块对象的新引用,或者如果发生错误,则返回 NULL 并设置一个异常。在错误情况下,name 会从 sys.modules 中移除,即使在调用 PyImport_ExecCodeModule()name 已经存在于 sys.modules 中。将未完全初始化的模块留在 sys.modules 中是危险的,因为导入此类模块无法知道模块对象处于未知状态(并且可能在模块作者的意图方面受到损坏)。

模块的 __spec____loader__ 将会被设置,如果尚未设置,则会设置为适当的值。spec 的 loader 将被设置为模块的 __loader__ (如果已设置),否则会被设置为 SourceFileLoader 的一个实例。

模块的 __file__ 属性将设置为代码对象的 co_filename。如果适用,__cached__ 也会被设置。

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

如果 name 指向形如 package.module 的点状名称,任何尚未创建的包结构仍将不会被创建。

另请参阅 PyImport_ExecCodeModuleEx()PyImport_ExecCodeModuleWithPathnames()

在 3.12 版本中变更: 设置 __cached____loader__ 已被弃用。 有关替代方法,请参见 ModuleSpec

PyObject *PyImport_ExecCodeModuleEx(const char *name, PyObject *co, const char *pathname)
返回值:新的引用。 稳定 ABI 的一部分。

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

另请参阅 PyImport_ExecCodeModuleWithPathnames()

PyObject *PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, PyObject *cpathname)
返回值:新的引用。 自 3.7 版本起成为 稳定 ABI 的一部分。

PyImport_ExecCodeModuleEx() 类似,但如果 cpathname 不为 NULL,则模块对象的 __cached__ 属性设置为 cpathname。在这三个函数中,这是首选的函数。

在 3.3 版本中添加。

在 3.12 版本中变更: 设置 __cached__ 已被弃用。 有关替代方法,请参见 ModuleSpec

PyObject *PyImport_ExecCodeModuleWithPathnames(const char *name, PyObject *co, const char *pathname, const char *cpathname)
返回值:新的引用。 稳定 ABI 的一部分。

PyImport_ExecCodeModuleObject() 类似,但namepathnamecpathname 是 UTF-8 编码的字符串。如果 pathname 设置为 NULL,也会尝试从 cpathname 中推断出 pathname 的值。

3.2 版本中新增。

在 3.3 版本中更改: 如果仅提供了字节码路径,则在计算源路径时使用 imp.source_from_cache()

在 3.12 版本中更改: 不再使用已删除的 imp 模块。

long PyImport_GetMagicNumber()
属于 稳定 ABI 的一部分。

返回 Python 字节码文件(又名 .pyc 文件)的魔术数字。魔术数字应以小端字节序存在于字节码文件的前四个字节中。发生错误时返回 -1

在 3.3 版本中更改: 失败时返回值 -1

const char *PyImport_GetMagicTag()
属于 稳定 ABI 的一部分。

返回 PEP 3147 格式的 Python 字节码文件名的魔术标签字符串。请记住,sys.implementation.cache_tag 中的值是权威的,应使用它而不是此函数。

3.2 版本中新增。

PyObject *PyImport_GetModuleDict()
返回值:借用引用。稳定 ABI 的一部分。

返回用于模块管理的字典(又名 sys.modules)。请注意,这是一个每个解释器的变量。

PyObject *PyImport_GetModule(PyObject *name)
返回值:新引用。自 3.8 版本起,属于 稳定 ABI 的一部分。

返回已导入的具有给定名称的模块。如果该模块尚未导入,则返回 NULL,但不会设置错误。如果查找失败,则返回 NULL 并设置错误。

3.7 版本中新增。

PyObject *PyImport_GetImporter(PyObject *path)
返回值:新的引用。 稳定 ABI 的一部分。

sys.path/pkg.__path__path 返回一个查找器对象,可能会从 sys.path_importer_cache 字典中获取它。如果尚未缓存,则遍历 sys.path_hooks,直到找到可以处理路径项的钩子。如果没有钩子可以处理,则返回 None;这告诉我们的调用者 基于路径的查找器 找不到此路径项的查找器。将结果缓存在 sys.path_importer_cache 中。返回对查找器对象的新引用。

int PyImport_ImportFrozenModuleObject(PyObject *name)
自 3.7 版本起,属于 稳定 ABI 的一部分。

加载名为 name 的冻结模块。成功返回 1,如果找不到该模块,则返回 0,如果初始化失败,则返回 -1 并设置异常。要访问成功加载的导入模块,请使用 PyImport_ImportModule()。(请注意命名不当 — 如果该模块已导入,此函数将重新加载该模块。)

在 3.3 版本中添加。

在 3.4 版本中更改: 不再在模块上设置 __file__ 属性。

int PyImport_ImportFrozenModule(const char *name)
属于 稳定 ABI 的一部分。

PyImport_ImportFrozenModuleObject() 类似,但名称是 UTF-8 编码的字符串,而不是 Unicode 对象。

struct _frozen

这是冻结模块描述符的结构类型定义,由 freeze 实用程序生成(请参阅 Python 源代码发行版中的 Tools/freeze/)。其定义在 Include/import.h 中找到,是

struct _frozen {
    const char *name;
    const unsigned char *code;
    int size;
    bool is_package;
};

在 3.11 版本中更改: 新的 is_package 字段指示模块是否为包。这取代了将 size 字段设置为负值。

const struct _frozen *PyImport_FrozenModules

此指针被初始化为指向 _frozen 记录的数组,该数组以其成员全部为 NULL 或零的记录终止。当导入冻结模块时,会在该表中搜索它。第三方代码可以利用此表来提供动态创建的冻结模块集合。

int PyImport_AppendInittab(const char *name, PyObject *(*initfunc)(void))
属于 稳定 ABI 的一部分。

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

struct _inittab

描述内置模块列表中单个条目的结构。嵌入 Python 的程序可以将这些结构的数组与 PyImport_ExtendInittab() 结合使用,以提供额外的内置模块。该结构包含两个成员

const char *name

模块名称,以 ASCII 编码的字符串表示。

PyObject *(*initfunc)(void)

为内置于解释器中的模块提供的初始化函数。

int PyImport_ExtendInittab(struct _inittab *newtab)

向内置模块表中添加一组模块。newtab 数组必须以一个哨兵条目结束,该条目的 name 字段包含 NULL;未能提供哨兵值可能会导致内存错误。成功时返回 0,如果无法分配足够的内存来扩展内部表,则返回 -1。如果发生故障,则不会向内部表添加任何模块。必须在 Py_Initialize() 之前调用此函数。

如果多次初始化 Python,则必须在每次 Python 初始化之前调用 PyImport_AppendInittab()PyImport_ExtendInittab()