[英]Why can't you reference modules that appear to be automatically loaded by the interpreter without an additional `import` statement?
當您啟動Python解釋器時,似乎在啟動過程中會自動導入某些模塊/包:
python
Python 2.7.6 (default, Jan 13 2014, 14:59:37)
...
>>> import sys
>>> for key in sys.modules.iterkeys():
... print(key)
...
os
sys
abc
others ...
但是,這些模塊似乎已加載到不同的范圍/命名空間中,因為如果不進行其他import
則無法訪問它們:
>>> abc
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'abc' is not defined
這是我的問題:
sys
模塊將它們加載到sys.modules
字典命名空間中
如果你想,我想你可以訪問它們
abc = sys.modules["abc"]
但不確定你為什么要這么做
它包括您導入的所有模塊,因此如果您del module
模塊仍將出現在dict中,但這並不意味着您可以訪問它:
In [16]: import BeautifulSoup
In [17]: sys.modules["BeautifulSoup"]
Out[17]: <module 'BeautifulSoup' from '/usr/local/lib/python2.7/dist-packages/BeautifulSoup.pyc'>
In [18]: BeautifulSoup.re
Out[18]: <module 're' from '/usr/lib/python2.7/re.pyc'>
In [19]: del BeautifulSoup
In [20]: sys.modules["BeautifulSoup"]
Out[20]: <module 'BeautifulSoup' from '/usr/local/lib/python2.7/dist-packages/BeautifulSoup.pyc'>
In [21]: BeautifulSoup.re
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-21-db67e3f66def> in <module>()
----> 1 BeautifulSoup.re
NameError: name 'BeautifulSoup' is not defined
Python在啟動時預加載一些模塊,導入的任何模塊也會導入其他模塊,這意味着其他模塊可以出現在sys.modules中,但在命名空間中無法訪問:
In [1]: sys.modules["numpy"]
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-1-88fb63c48e78> in <module>()
----> 1 sys.modules["numpy"]
KeyError: 'numpy'
In [2]: cat test.py
import numpy
In [3]: import test
In [4]: sys.modules["numpy"]
Out[4]: <module 'numpy' from '/usr/local/lib/python2.7/dist-packages/numpy/__init__.pyc'>
In [5]: numpy.array
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-5-132169fc46d3> in <module>()
----> 1 numpy.array
在新的解釋器啟動時, sys.modules
將包含由Python自動加載的那些模塊,因為它們執行Python解釋器運行所必需的角色。 例如, Py_InitializeEx
中Python/pythonrun.c
包括像線
bimod = _PyBuiltin_Init();
初始化__builtin__
模塊,其中builtins像int
和open
live,和
sysmod = _PySys_Init();
初始化sys
模塊。
至於加載這些模塊的命名空間,模塊並沒有真正加載到命名空間中。 import
語句加載模塊並將模塊中的一個或多個項目分配給當前命名空間中的一個或多個變量,但模塊加載和賦值是獨立的步驟。 像_PySys_Init
這樣的調用不會將模塊分配到任何特定的命名空間。 但是,導入機制將在sys.modules
記錄當前Python執行中由任何代碼加載的任何模塊,因此進一步導入不會重新執行模塊並創建新副本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.