【发布时间】:2022-09-23 09:06:21
【问题描述】:
python docs 状态:
一个完整的 Python 程序在最小初始化环境中执行:所有内置和标准模块都可用,但没有一个被初始化,除了
sys(各种系统服务)、builtins(内置函数、异常和无)和__main__。这表明只有这三个模块应该被列为带有the following code snippet 的加载模块:
import sys print(sys.modules.keys())但是,使用 CPython v3.10 (with -S option) 运行代码 sn-p 会在我的 PC 上返回以下内容:
dict_keys([\'sys\', \'builtins\', \'_frozen_importlib\', \'_imp\', \'_thread\', \'_warnings\', \'_weakref\', \'_io\', \'marshal\', \'nt\', \'winreg\', \'_frozen_importlib_external\', \'time\', \'zipimport\', \'_codecs\', \'codecs\', \'encodings.aliases\', \'encodings\', \'encodings.utf_8\', \'encodings.cp1252\', \'_signal\', \'_abc\', \'abc\', \'io\', \'__main__\'])与文档中提到的“最小初始化环境”相比,为什么在运行时加载了 22 个额外的模块?
我在下面用我自己的答案更新我对 CPython 的额外加载模块的理解。
-
文档中没有任何内容表明您看到的输出,因为该描述是针对理论上可能存在的最简单的 Python。您可能通过 CPython 运行该代码,该 CPython 提供特定于实现的环境,由其
_frozen_importlib的默认导入提供。在 pypy 实现中运行相同的代码将导致一些相同的键加上某些其他键。 -
@metatoaster 我已经更新了这个问题,专门询问 CPython 需要这么多包的原因。
-
值得怀疑的是,除了文档未描述的实现细节之外,您还会得到一个具体的答案。如果这真的让你感到厌烦,我建议在 CPython 的issue tracker 提交问题。
-
此外,您可以运行
python -S -v -c \'\',它将打印出在启动期间导入的内容并运行一个空的 Python 程序。
标签: python python-module cpython