导入模块 — Python 文档

来自菜鸟教程
Python/docs/2.7/c-api/import
跳转至:导航、​搜索

导入模块

PyObject *PyImport_ImportModule(const char *name)

这是下面 PyImport_ImportModuleEx() 的简化接口,将 globalslocals 参数设置为 NULL 和 level[ X169X] 设置为 0。 当 name 参数包含一个点时(当它指定一个包的子模块时),fromlist 参数被设置为列表 ['*'] 以便返回值是命名模块而不是包含它的顶级包,否则会出现这种情况。 (不幸的是,当 name 实际上指定子包而不是子模块时,这会产生额外的副作用:加载包的 __all__ 变量中指定的子模块。)返回对导入的模块,或 NULL 在失败时设置异常。 在 Python 2.4 之前,模块可能仍会在失败情况下创建——检查 sys.modules 以找出答案。 从 Python 2.4 开始,模块导入失败不再将模块留在 sys.modules 中。

2.4 版更改: 失败导入删除不完整的模块对象。

在 2.6 版更改: 始终使用绝对导入。

PyObject *PyImport_ImportModuleNoBlock(const char *name)

此版本的 PyImport_ImportModule() 不会阻塞。 它旨在用于导入其他模块以执行函数的 C 函数。 如果另一个线程持有导入锁,导入可能会阻塞。 函数 PyImport_ImportModuleNoBlock() 从不阻塞。 它首先尝试从 sys.modules 获取模块并回退到 PyImport_ImportModule() 除非锁被持有,在这种情况下,该函数将引发 ImportError

2.6 版中的新功能。

PyObject *PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals, PyObject *fromlist)

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

返回值是对导入模块或顶级包的新引用,或 NULL 失败时设置异常(在 Python 2.4 之前,在这种情况下仍可能创建模块)。 与 __import__() 一样,请求包的子模块时的返回值通常是顶级包,除非给出了非空的 fromlist

2.4 版更改: 失败导入删除不完整的模块对象。

2.6 版本变更: 该函数是 PyImport_ImportModuleLevel() 的别名,以 -1 为级别,表示相对导入。

PyObject *PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)

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

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

2.5 版中的新功能。

PyObject *PyImport_Import(PyObject *name)

这是调用当前“导入钩子函数”的高级接口。 它从当前全局变量的 __builtins__ 调用 __import__() 函数。 这意味着导入是使用当前环境中安装的任何导入钩子完成的,例如 通过 rexecihooks

在 2.6 版更改: 始终使用绝对导入。

PyObject *PyImport_ReloadModule(PyObject *m)
重新加载一个模块。 这最好通过参考内置的 Python 函数 reload() 来描述,因为标准的 reload() 函数直接调用这个函数。 返回对重新加载的模块的新引用,或 NULL 并在失败时设置异常(在这种情况下模块仍然存在)。
PyObject *PyImport_AddModule(const char *name)

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

笔记

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

PyObject *PyImport_ExecCodeModule(char *name, PyObject *co)

给定模块名称(可能采用 package.module 形式)和从 Python 字节码文件读取或从内置函数 compile() 获得的代码对象,加载模块。 如果发生错误,则返回对模块对象的新引用,或 NULL 并设置异常。 在 Python 2.4 之前,模块仍然可以在错误情况下创建。 从 Python 2.4 开始,name 在错误情况下从 sys.modules 中删除,即使 name 已经在 sys.modules进入 PyImport_ExecCodeModule()。 将未完全初始化的模块留在 sys.modules 中是危险的,因为此类模块的导入无法知道模块对象是未知(并且可能根据模块作者的意图而损坏)状态。

模块的 __file__ 属性将设置为代码对象的 co_filename

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

如果 name 指向形式为 package.module 的带点名称,则仍不会创建任何尚未创建的包结构。

2.4 版更改:name 在错误情况下从 sys.modules 中删除。

PyObject *PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
PyImport_ExecCodeModule()类似,但是模块对象的__file__属性设置为pathname,如果不是NULL
long PyImport_GetMagicNumber()
返回 Python 字节码文件的幻数(又名 .pyc.pyo 文件)。 幻数应该以小端字节序出现在字节码文件的前四个字节中。
PyObject *PyImport_GetModuleDict()
返回用于模块管理的字典(又名 sys.modules)。 请注意,这是每个解释器的变量。
PyObject *PyImport_GetImporter(PyObject *path)

sys.path/pkg.__path__path 返回一个导入器对象,可能通过从 sys.path_importer_cache dict 中获取它。 如果尚未缓存,则遍历 sys.path_hooks 直到找到可以处理路径项的钩子。 如果没有钩子,则返回 None; 这告诉我们的调用者它应该回退到内置的导入机制。 将结果缓存在 sys.path_importer_cache 中。 返回对导入器对象的新引用。

2.6 版中的新功能。

void _PyImport_Init()
初始化导入机制。 仅限内部使用。
void PyImport_Cleanup()
清空模块表。 仅限内部使用。
void _PyImport_Fini()
完成导入机制。 仅限内部使用。
PyObject *_PyImport_FindExtension(char*, char*)
仅限内部使用。
PyObject *_PyImport_FixupExtension(char*, char*)
仅限内部使用。
int PyImport_ImportFrozenModule(char *name)
加载名为 name 的冻结模块。 成功返回1,未找到模块返回0,初始化失败返回-1异常。 要在成功加载时访问导入的模块,请使用 PyImport_ImportModule()。 (注意用词不当——如果模块已经被导入,这个函数会重新加载模块。)
struct _frozen

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

struct _frozen {
    char *name;
    unsigned char *code;
    int size;
};
struct _frozen *PyImport_FrozenModules
这个指针被初始化为指向一个 struct _frozen 记录的数组,由一个成员都是 NULL 或零的记录终止。 导入冻结模块时,将在此表中搜索。 第三方代码可以利用此技巧来提供动态创建的冻结模块集合。
int PyImport_AppendInittab(const char *name, void (*initfunc)(void))
将单个模块添加到现有的内置模块表中。 这是 PyImport_ExtendInittab() 的便利包装器,如果表无法扩展,则返回 -1。 新模块可以通过名称 name 导入,并使用函数 initfunc 作为首次尝试导入时调用的初始化函数。 这应该在 Py_Initialize() 之前调用。
struct _inittab

描述内置模块列表中单个条目的结构。 这些结构中的每一个都给出了内置于解释器中的模块的名称和初始化函数。 嵌入 Python 的程序可以将这些结构的数组与 PyImport_ExtendInittab() 结合使用以提供额外的内置模块。 该结构在Include/import.h中定义为:

struct _inittab {
    char *name;
    void (*initfunc)(void);
};
int PyImport_ExtendInittab(struct _inittab *newtab)
将模块集合添加到内置模块表中。 newtab 数组必须以包含 name 字段的 NULL 的标记条目结束; 未能提供标记值可能会导致内存故障。 成功时返回 0,如果没有足够的内存来扩展内部表,则返回 -1。 如果发生故障,则不会向内部表添加任何模块。 这应该在 Py_Initialize() 之前调用。