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 from sys.modules in error cases, even if name was already in sys.modules on entry to 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)
返回值:新引用。

PyImport_ExecCodeModule(),但是如果不是NULL,模块对象的__file__属性设置为pathname >。

另请参见PyImport_ExecCodeModuleWithPathnames()

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_GetModuleDict()
返回值:借用引用。

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

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()

完成导入机制。仅限内部使用。

PyObject* _PyImport_FindExtension(char *, char *)

仅限内部使用。

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()之前调用。