为什么 Python 3 中 'sys.modules' 中没有导入的模块?

Why are modules that haven't been imported in 'sys.modules' in Python 3?

我正在阅读 ,说明似乎很清楚,请检查 sys.modules 中的模块。这与我在 Python 2 中预期的一样有效,但不适用于 Python 3(已测试 3.5 和 3.6)。例如:

Python 3.6

>>> import sys
>>> 'itertools' in sys.modules
True

Python 2.7

>>> import sys
>>> 'itertools' in sys.modules
False

我注意到,itertools 在 Python 3 sys.modules dict (<module 'itertools' (built-in)>) 中被描述为 'built-in',而不是在 Python 2 所以也许这就是为什么它在导入之前位于 sys.modules,但它是 not listed as a built-in。无论如何,由于 itertools 仍然需要在 Python 3 中导入,我将不胜感激。

似乎在 Python 3 中,itertools 扩展实际上被编译到主 Python 二进制文件中,这与 Python 2 不同。如果您执行

import sys

然后是

'itertools' in sys.builtin_module_names
>> True

很清楚。在 Python 2.x 控制台中执行完全相同的步骤会导致 False.

As per the docs, builtin_module_names 包含 'modules that are compiled into this Python interpreter'.

它们已经被导入,只是不是你导入的。究竟是解释器启动的哪些部分导致加载模块是不重要的实现细节,但如果需要,您可以追踪可能的路径。例如,itertoolsreprlib

导入
from itertools import islice

functools导入:

from reprlib import recursive_repr

types导入:

import functools as _functools

importlib导入:

import types

它在解释器启动时被引导,因为它是大多数导入实现的地方。