导入模块

PyObject *PyImport_ImportModule(const char *name)
Return value: New reference.

这是一个简化的接口 PyImport_ImportModuleEx() 下面,离开 全局变量当地人 参数设置为 NULL水平 设置为0。当 name 参数包含一个点(当它指定包的子模块时),则 来自列表 参数设置为列表 ['*'] 因此,返回值是命名模块,而不是包含它的顶级包,否则就是这种情况。(不幸的是,当 name 实际上,指定的是子包而不是子模块:包的 __all__ 变量已加载。)返回对导入模块的新引用,或 NULL 在失败时设置异常。模块导入失败不会将模块留在 sys.modules .

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

PyObject *PyImport_ImportModuleNoBlock(const char *name)
Return value: New reference.

此函数是不推荐使用的别名 PyImport_ImportModule() .

在 3.3 版更改: 此函数用于在另一个线程持有导入锁时立即失败。不过,在Python3.3中,锁方案在大多数情况下都转换为每个模块的锁,因此不再需要这个函数的特殊行为。

PyObject *PyImport_ImportModuleEx(const char *name, PyObject *globals, PyObject *locals, PyObject *fromlist)
Return value: New reference.

导入模块。最好参考内置的python函数来描述这一点。 __import__() .

返回值是对导入的模块或顶级包的新引用,或者 NULL 在失败时设置异常。喜欢 __import__() ,请求包的子模块时的返回值通常是顶级包,除非 来自列表 被给予。

导入失败会删除不完整的模块对象,如 PyImport_ImportModule() .

PyObject *PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)
Return value: New reference.

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

返回值是对导入的模块或顶级包的新引用,或者 NULL 在失败时设置异常。喜欢 __import__() ,请求包的子模块时的返回值通常是顶级包,除非 来自列表 被给予。

3.3 新版功能.

PyObject *PyImport_ImportModuleLevel(const char *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)
Return value: New reference.

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

在 3.3 版更改: 的负值 level 不再被接受。

PyObject *PyImport_Import(PyObject *name)
Return value: New reference.

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

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

PyObject *PyImport_ReloadModule(PyObject *m)
Return value: New reference.

重新加载模块。返回对重新加载的模块的新引用,或 NULL 在发生故障时设置异常(在这种情况下,模块仍然存在)。

PyObject *PyImport_AddModuleObject(PyObject *name)
Return value: Borrowed reference.

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

注解

此函数不加载或导入模块;如果模块尚未加载,您将得到一个空的模块对象。使用 PyImport_ImportModule() 或者它的一个变体来导入模块。由点式名称表示的包结构 name 如果不存在,则不创建。

3.3 新版功能.

PyObject *PyImport_AddModule(const char *name)
Return value: Borrowed reference.

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

PyObject *PyImport_ExecCodeModule(const char *name, PyObject *co)
Return value: New reference.

给出模块名(可能是形式 package.module )以及从python字节码文件读取或从内置函数获取的代码对象。 compile() ,加载模块。返回对模块对象的新引用,或 NULL 如果发生错误,则设置异常。 name 被从 sys.modules 在错误情况下,即使 name 已经在 sys.modules 关于进入 PyImport_ExecCodeModule() . 在中保留未完全初始化的模块 sys.modules 这是危险的,因为这些模块的导入无法知道模块对象是未知状态(并且很可能是由于模块作者的意图而损坏)。

模块的 __spec____loader__ 如果尚未设置,将使用适当的值进行设置。规范的加载程序将设置为模块的 __loader__ (如果设置)和 SourceFileLoader 否则。

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

如果模块已经导入,此函数将重新加载模块。见 PyImport_ReloadModule() 以预期的方式重新加载模块。

如果 name 指向表单的虚线名称 package.module ,仍将不创建任何尚未创建的包结构。

也见 PyImport_ExecCodeModuleEx()PyImport_ExecCodeModuleWithPathnames() .

PyObject *PyImport_ExecCodeModuleEx(const char *name, PyObject *co, const char *pathname)
Return value: New reference.

类似于 PyImport_ExecCodeModule() 但是 __file__ 模块对象的属性设置为 路径名 如果它不是``空``。

也见 PyImport_ExecCodeModuleWithPathnames() .

PyObject *PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, PyObject *cpathname)
Return value: New reference.

类似于 PyImport_ExecCodeModuleEx() 但是 __cached__ 模块对象的属性设置为 cPATNEX 如果它不是``空``。在这三种功能中,这是首选的一种。

3.3 新版功能.

PyObject *PyImport_ExecCodeModuleWithPathnames(const char *name, PyObject *co, const char *pathname, const char *cpathname)
Return value: New reference.

类似于 PyImport_ExecCodeModuleObject() ,但是 name路径名cPATNEX 是UTF-8编码的字符串。还试图找出价值所在。 路径名 应该来自 cPATNEX 如果前者设置为 NULL .

3.2 新版功能.

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

long PyImport_GetMagicNumber()

返回python字节码文件的幻数(a.k.a. .pyc 文件)。幻数应该以小尾数字节顺序出现在字节码文件的前四个字节中。返回 -1 关于错误。

在 3.3 版更改: 的返回值 -1 失败后。

const char *PyImport_GetMagicTag()

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

3.2 新版功能.

PyObject *PyImport_GetModuleDict()
Return value: Borrowed reference.

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

PyObject *PyImport_GetModule(PyObject *name)
Return value: New reference.

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

3.7 新版功能.

PyObject *PyImport_GetImporter(PyObject *path)
Return value: New reference.

返回查找器对象 sys.path/pkg.__path__ 项目 path 可能是从 sys.path_importer_cache 如果还没有缓存,则遍历 sys.path_hooks 直到找到可以处理路径项的挂钩。返回 None 如果没有钩子,这就告诉我们的调用方 path based finder 找不到此路径项的查找程序。将结果缓存到 sys.path_importer_cache . 返回对finder对象的新引用。

int PyImport_ImportFrozenModuleObject(PyObject *name)
Return value: New reference.

加载一个名为 name . 返回 1 为了成功, 0 如果找不到模块,以及 -1 如果初始化失败,则设置异常。要在成功加载时访问导入的模块,请使用 PyImport_ImportModule() . (注意错误的名称---如果模块已经导入,此函数将重新加载模块。)

3.3 新版功能.

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

int PyImport_ImportFrozenModule(const char *name)

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

struct _frozen

这是冻结模块描述符的结构类型定义,由 freeze 实用程序(见) Tools/freeze/ 在python源代码发行版中)。其定义见 Include/import.h 是:

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

此指针初始化为指向 struct _frozen 记录,由成员均为 NULL 或者是零。导入冻结模块时,将在此表中进行搜索。第三方代码可以利用这一点来提供动态创建的冻结模块集合。

int PyImport_AppendInittab(const char *name, PyObject *(*initfunc)(void))

将单个模块添加到现有的内置模块表中。这是个方便的封装纸 PyImport_ExtendInittab() 归来 -1 如果表不能扩展。可以按名称导入新模块 name ,并使用函数 因特芬克 作为在第一次尝试导入时调用的初始化函数。这应该在之前调用 Py_Initialize() .

struct _inittab

结构,描述内置模块列表中的单个条目。这些结构中的每一个都为解释器中内置的模块提供了名称和初始化函数。名称是一个ASCII编码的字符串。嵌入python的程序可以将这些结构的数组与 PyImport_ExtendInittab() 提供额外的内置模块。结构定义在 Include/import.h AS::

struct _inittab {
    const char *name;           /* ASCII encoded string */
    PyObject* (*initfunc)(void);
};
int PyImport_ExtendInittab(struct _inittab *newtab)

将模块集合添加到内置模块表中。这个 新标签 数组必须以包含 NULL 对于 name 字段;未能提供sentinel值可能导致内存故障。退换商品 0 关于成功还是 -1 如果分配的内存不足,无法扩展内部表。如果发生故障,则不会向内部表中添加任何模块。这应该在之前调用 Py_Initialize() .