2017-02-17 70 views
9

我讀的是how to check if a python module has been imported,說明看起來很清楚,請檢查sys.modules中的模塊。這可以像我在Python 2中預期的那樣工作,但不適用於Python 3(經過測試的3.5和3.6)。例如:爲什麼沒有在Python 3的'sys.modules'中導入的模塊?

的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中,所以也許這就是爲什麼它在導入之前在sys.modules中,但它是not listed as a built-in。無論如何,因爲itertools仍然需要在Python 3中導入,所以我會很感激解釋。

+4

如果您已*導入的模塊需要導入自己的模塊,那麼這些模塊將顯示爲已加載。 Python 2中可能引入了一種依賴關係,這在Python 2中是不存在的。即使加載了模塊,也需要「導入」它使其在當前範圍內可用。 –

+1

我想你自己已經回答了這個問題:如果'itertools'已經成爲內置函數,它將在解釋器啓動時加載。 – ForceBru

+0

是爲什麼'itertools'需要導入或者爲什麼它存在並且沒有在文檔中列出? –

回答

7

他們被導入,只是不是由你。解釋器啓動的哪些部分導致模塊被加載是不重要的實現細節,但是如果需要,您可以跟蹤可能的路徑。例如,itertoolsreprlib

from itertools import islice 

其通過functools進口的輸入:

from reprlib import recursive_repr 

其通過types進口:

import functools as _functools 

其通過importlib進口:

import types 

它是在解釋器啓動時引導的,因爲它是大多數導入實現的地方。

+0

太好了,謝謝你的權威回答。所以解釋器導入'itertools'(和其他模塊,如'os'),但不會將它們添加到'globals()'中,因此它們不可訪問? –

+0

@Chris_Rands:它遵循正常的導入規則。如果模塊'foo'確實使用'import bar',那麼導入只會使'bar'模塊可用於'foo'模塊。每個想要使用模塊的人都需要自己導入它。 – user2357112

+1

,這就是爲什麼你無法在'Py 2'中找到它的原因。我猜測,當導入機制仍然在'C'中實現時,(顯然)並沒有間接導入'itertools'。 –

-1

看來,在Python 3,迭代工具擴展實際上編譯成主要的Python二進制不同的Python 2.如果你做一個

import sys 

然後

'itertools' in sys.builtin_module_names 
>> True 

很明顯。在Python 2.x控制檯中執行完全相同的步驟會產生False

As per the docs,builtin_module_names包含'模塊,這些模塊被編譯到這個Python解釋器'

+0

問題是*爲什麼這是,而不是它就是這樣。 –

+0

@ JimFasarakis-Hilliard對於「_why是在Python 3中導入之前在sys.modules中的itertools」而不是在Python 2_中的「是」因爲它是內置的,並且它在builtin_module_names中存在。 – Anomitra

+2

雖然模塊確實被編譯到Python中,但這些模塊仍然需要在「sys.modules」中顯示之前通過某個導入進行初始化和加載。 – user2357112

相關問題