@classmethod
def create_module(self, spec):
"""Create a built-in module"""
if spec.name not in sys.builtin_module_names:
raise ImportError('{!r} is not a built-in module'.format(spec.name),
name=spec.name)
return _call_with_frames_removed(_imp.create_builtin, spec)
在这里,有比你可能需要的更多的细节。在
posix
是一个内置模块。当您听到“内置模块”时,您可能会想到普通的标准库模块,或者您可能会想到用C编写的模块,但是posix
比大多数模块更内置。在posix
模块是用C编写的,在^{.so
或{posix
实际上直接编译到Python可执行文件本身中。在CPython导入系统的一个内部细节是^{} array :
这是一个
struct _inittab
s的数组,它由一个名称和一个用于具有该名称的模块的C模块初始化函数组成。这里列出的模块是内置的。在这个数组最初被设置为},具体取决于您的操作系统,但这里不是这样)。不幸的是,} 生成的,因此我无法向您显示源代码链接,但以下是我生成文件时的部分内容:
^{pr2}$_PyImport_Inittab
,它来自Modules/config.c
(或{Modules/config.c
是在Python构建过程中从^{{{cd16>模块的初始化可以在这里看到。在
作为导入系统的一部分,当尝试加载模块时,Python要经过} 方法:
sys.meta_path
,一个模块列表finders。其中一个查找器负责执行您可能更熟悉的sys.path
搜索,但另一个是_frozen_importlib.BuiltinImporter
,负责查找posix
之类的内置模块。当Python尝试这个finder时,它运行finder的^{它使用^{} 来搜索
PyImport_Inittab
中的"posix"
名称。搜索会找到名称,因此find_spec
返回一个模块规范,表示内置模块的加载程序应该处理创建此模块的事实。(加载程序是spec_from_loader
的第二个参数。这里是cls
,因为BuiltinImporter
既是查找器也是装载器。)然后,Python运行加载程序的^{} 方法来生成模块对象:
它委托给^{} ,后者在
PyImport_Inittab
中搜索模块名并运行相应的初始化函数。在(
_call_with_frames_removed(x, y)
只是调用x(y)
,但是part of the import system将它视为一个神奇的指示器,可以从堆栈跟踪中剥离importlib
帧,这就是为什么当导入出错时,您永远不会在堆栈跟踪中看到这些帧。)如果您想了解更多相关的代码路径,您可以查看^{} ,其中大部分导入实现位于^{} ,其中大部分C部分实现位于其中)和{a12},这是字节码解释器循环所在的地方,因此也是
import
语句执行的起点,在它到达进口机械的核心部件之前。在相关文档包括section of the language reference on the import system,以及政治公众人物451和{a15}。虽然我发现a bit of documentation针对的是在其他程序中嵌入Python的人,但是没有太多关于内置模块的文档,因为他们可能想要修改
PyImport_Inittab
,还有{a17}列表。在相关问题 更多 >
编程相关推荐