Importing Modules¶
- PyObject*
PyImport_ImportModule
(const char *name)¶ - 返回值:新引用。
This is a simplified interface to
PyImport_ImportModuleEx()
below, leaving the globals and locals arguments set to NULL and level set to 0. 当name参数包含一个点(当它指定包的子模块时),fromlist参数设置为列表['*']
(不幸的是,当name实际上指定了子包而不是子模块时,这会产生额外的副作用:加载包中的__all__
变量中指定的子模块。)返回对引入的模块的新引用,或者在失败时设置了异常,NULL。模块的失败导入不会将模块留在sys.modules
中。此函数始终使用绝对导入。
- PyObject*
PyImport_ImportModuleNoBlock
(const char *name)¶ 此函数是
PyImport_ImportModule()
的已弃用别名。在版本3.3中更改:此函数用于在导入锁定由另一个线程持有时立即失败。在Python 3.3中,锁定方案切换到每个模块的锁大多数目的,所以这个功能的特殊行为不再需要。
- 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)¶ 导入模块。这最好通过参考内建Python函数
__import__()
来描述,因为标准__import__()
函数直接调用此函数。返回值是对引入的模块或顶层包的新引用,或者在失败时设置了异常的NULL。像
__import__()
一样,当请求包的子模块时的返回值通常是顶层包,除非给出了非空的fromlist。版本3.3中的新功能。
- PyObject*
PyImport_ImportModuleLevel
(const char *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)¶ - 返回值:新引用。
与
PyImport_ImportModuleLevelObject()
类似,但名称是UTF-8编码的字符串,而不是Unicode对象。在版本3.3中已更改: 级别的负值不再接受。
- PyObject*
PyImport_Import
(PyObject *name)¶ - 返回值:新引用。
这是一个更高级别的接口,调用当前的“导入钩子函数”(显式的级别为0,表示绝对导入)。它从当前全局变量的
__builtins__
调用__import__()
函数。这意味着导入是使用当前环境中安装的任何导入钩子完成的。此函数始终使用绝对导入。
- PyObject*
PyImport_ReloadModule
(PyObject *m)¶ - 返回值:新引用。
重新加载模块。返回对重新加载的模块的新引用,或NULL,在失败时设置异常(在此情况下模块仍然存在)。
- PyObject*
PyImport_AddModuleObject
(PyObject *name)¶ 返回与模块名称对应的模块对象。名称参数可以是
package.module
的形式。首先检查模块字典,如果有一个,如果没有,创建一个新的,并将其插入模块字典。返回NULL,失败时设置异常。注意
此函数不加载或导入模块;如果模块尚未加载,您将获得一个空的模块对象。使用
PyImport_ImportModule()
或其变体之一导入模块。如果尚未出现名称的虚线名称,则不会创建包结构。版本3.3中的新功能。
- PyObject*
PyImport_AddModule
(const char *name)¶ - 返回值:借用引用。
与
PyImport_AddModuleObject()
类似,但名称是UTF-8编码的字符串,而不是Unicode对象。
- PyObject*
PyImport_ExecCodeModule
(const char *name, PyObject *co)¶ - 返回值:新引用。
给定一个模块名(可能是
package.module
)和从Python字节码文件读取或从内建函数compile()
中获取的代码对象,加载模块。返回对模块对象的新引用,或NULL,如果发生错误,则设置异常。name is removed fromsys.modules
in error cases, even if name was already insys.modules
on entry toPyImport_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)¶ - 返回值:新引用。
像
PyImport_ExecCodeModule()
,但是如果不是NULL
,模块对象的__file__
属性设置为pathname >。
- PyObject*
PyImport_ExecCodeModuleObject
(PyObject *name, PyObject *co, PyObject *pathname, PyObject *cpathname)¶ 像
PyImport_ExecCodeModuleEx()
,但如果模块对象的__cached__
属性为非NULL
,则设置为cpathname >。在三个功能中,这是首选使用。版本3.3中的新功能。
- PyObject*
PyImport_ExecCodeModuleWithPathnames
(const char *name, PyObject *co, const char *pathname, const char *cpathname)¶ 像
PyImport_ExecCodeModuleObject()
,但名称,路径名和cpathname是UTF-8编码的字符串。如果前者设置为NULL
,则尝试找出路径名的值应该来自cpathname。版本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字节码文件名。Keep in mind that the value at
sys.implementation.cache_tag
is authoritative and should be used instead of this function.版本3.2中的新功能。
- PyObject*
PyImport_GetImporter
(PyObject *path)¶ 返回
sys.path
/pkg.__path__
项路径的导入器对象,可能是从sys.path_importer_cache
如果尚未缓存,请遍历sys.path_hooks
,直到找到可以处理路径项的钩子。返回None
如果没有挂钩可以;这告诉我们的调用者应该回到内建导入机制。在sys.path_importer_cache
中缓存结果。返回对importer对象的新引用。
- void
_PyImport_Init
()¶ 初始化导入机制。仅限内部使用。
- void
PyImport_Cleanup
()¶ 清空模块表。仅限内部使用。
- void
_PyImport_Fini
()¶ 完成导入机制。仅限内部使用。
- int
PyImport_ImportFrozenModuleObject
(PyObject *name)¶ 加载名为名称的冻结模块。如果初始化失败,则返回
1
成功,0
(如果未找到模块)和-1
要在成功加载后访问导入的模块,请使用PyImport_ImportModule()
。(注意misnomer - 这个函数将重新加载模块,如果它已经导入)。版本3.3中的新功能。
在版本3.4中更改:不再在模块上设置
__file__
属性。
- int
PyImport_ImportFrozenModule
(const char *name)¶ 与
PyImport_ImportFrozenModuleObject()
类似,但名称是UTF-8编码的字符串,而不是Unicode对象。
- struct
_frozen
¶ 这是由freeze实用程序生成的冻结模块描述器的结构类型定义(参见Python源代码分发中的
Tools/freeze/
)。它在Include/import.h
中的定义是:struct _frozen { char *name; 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导入,并使用函数initfunc作为首次尝试导入时调用的初始化函数。这应该在Py_Initialize()
之前调用。
- struct
_inittab
¶ 描述内建模块列表中单个条目的结构。这些结构中的每一个给出了构建在解释器中的模块的名称和初始化函数。名称是ASCII编码的字符串。嵌入Python的程序可以与
PyImport_ExtendInittab()
结合使用这些结构的数组,以提供其他内建模块。结构在Include/import.h
中定义为:struct _inittab { char *name; /* ASCII encoded string */ PyObject* (*initfunc)(void); };
- int
PyImport_ExtendInittab
(struct _inittab *newtab)¶ 将内容模块添加到内建模块表中。newtab数组必须以
name
字段包含NULL的sentinel条目结尾;未能提供sentinel值可能导致内存故障。成功时返回0
,如果可以分配足够的内存来扩展内部表,则返回-1
。如果发生故障,则不会将模块添加到内部表。这应该在Py_Initialize()
之前调用。