簡體   English   中英

為什么不能引用看似由解釋器自動加載的模塊而沒有額外的`import`語句?

[英]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

這是我的問題:

  1. 加載這些模塊到底是為了什么目的?
  2. 他們加載了什么范圍/命名空間?

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_InitializeExPython/pythonrun.c包括像線

bimod = _PyBuiltin_Init();

初始化__builtin__模塊,其中builtins像intopen live,和

sysmod = _PySys_Init();

初始化sys模塊。

至於加載這些模塊的命名空間,模塊並沒有真正加載到命名空間中。 import語句加載模塊並將模塊中的一個或多個項目分配給當前命名空間中的一個或多個變量,但模塊加載和賦值是獨立的步驟。 _PySys_Init這樣的調用不會將模塊分配到任何特定的命名空間。 但是,導入機制將在sys.modules記錄當前Python執行中由任何代碼加載的任何模塊,因此進一步導入不會重新執行模塊並創建新副本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM