导入模块¶
-
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 是一个 Pythonstr
对象。在 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 在进入PyImport_ExecCodeModule()
时已经存在于sys.modules
中,也会从sys.modules
中移除 name。将未完全初始化的模块留在sys.modules
中是危险的,因为此类模块的导入无法知道模块对象处于未知(并且相对于模块作者的意图可能已损坏)状态。如果尚未设置,模块的
__spec__
和__loader__
将使用适当的值设置。spec 的加载器将设置为模块的__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。
-
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()
,但 name、pathname 和 cpathname 是 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 编码字符串。
-
const char *name¶
-
int PyImport_ExtendInittab(struct _inittab *newtab)¶
向内置模块表添加一组模块。newtab 数组必须以一个哨兵条目结束,该条目的
name
字段为NULL
;未能提供哨兵值可能导致内存故障。成功时返回0
,如果无法分配足够的内存来扩展内部表则返回-1
。如果失败,则不会向内部表添加任何模块。这必须在Py_Initialize()
之前调用。如果 Python 多次初始化,则必须在每次 Python 初始化之前调用
PyImport_AppendInittab()
或PyImport_ExtendInittab()
。
-
PyObject *PyImport_ImportModuleAttr(PyObject *mod_name, PyObject *attr_name)¶
- 返回值:新引用。
导入模块 mod_name 并获取其属性 attr_name。
名称必须是 Python
str
对象。结合
PyImport_Import()
和PyObject_GetAttr()
的辅助函数。例如,如果找不到模块,它可能会引发ImportError
,如果属性不存在,则会引发AttributeError
。在 3.14 版本加入。
-
PyObject *PyImport_ImportModuleAttrString(const char *mod_name, const char *attr_name)¶
- 返回值:新引用。
类似于
PyImport_ImportModuleAttr()
,但名称是 UTF-8 编码字符串,而不是 Pythonstr
对象。在 3.14 版本加入。