我正在阅读how to check if a python module has been imported,说明似乎很清楚,请检查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)>
)中被描述为“内置”,而不是在Python 2中,所以也许这就是为什么它在{在导入之前{1}},但它是not listed as a built-in。无论如何,由于sys.modules
仍然需要在Python 3中导入,我将不胜感激解释。
答案 0 :(得分:7)
他们已已导入,而不是您。解释器启动的哪些部分导致模块加载是不重要的实现细节,但是如果需要,可以跟踪可能的路径。例如,itertools
导入from itertools import islice
from reprlib import recursive_repr
由reprlib
导入:
import functools as _functools
由functools
导入:
import types
由types
导入:
SERVICE
是在解释器启动时引导的,因为它是大多数导入实现的地方。
答案 1 :(得分:-1)
似乎在Python 3中,itertools扩展实际上被编译成主要的Python二进制文件,与Python 2不同。如果你做了
import sys
然后是
'itertools' in sys.builtin_module_names
>> True
很明显。在Python 2.x控制台中执行完全相同的步骤会产生False
。
Fiddle,builtin_module_names
包含编译到此Python解释器中的&#39; 。