2014-03-26 86 views
2
import sys 
from sys import argv 

我讀了關於pydocs中的import語句的內容。它說它分兩步執行。 (1)找到一個模塊,並在必要時進行初始化; (2)在本地命名空間(發生導入語句的範圍)中定義一個或多個名稱。第一種形式(不含)爲list中的每個標識符重複這些步驟。具有from的表單執行步驟(1)一次,然後重複執行步驟(2)。python中各種導入語句的區別

這裏我明白,在第一種情況下,sys模塊將作爲第一步的一部分進行初始化,然後它將作爲第二步提供給本地命名空間。 但第二次進口形式會發生什麼? 將sys模塊初始化爲第一步,功能sys模塊(NO OTHER功能)可用於本地命名空間。 因爲我在使用第二種導入語句時無法調用sys模塊的任何其他功能。所以只是想特別澄清一下。彷彿sys模塊已經從import語句初始化,那麼我們應該可以使用sys調用其他函數。但那不起作用。 ?

#import sys 
from sys import argv 

script, input = argv 

print "This was the input entered by command line", input 

print sys.path # this is not working giving error name sys is not defined. 

我懷疑在從import語句sys模塊是沒有得到initalized,只有argv功能越來越初始化,但在這種情況下,從步驟有哪些呢執行步驟(1)一次平均pydocs情況下(注:我我在Python 2.7上工作)

+0

@MartijnPieters:還有你剛纔提到導入模塊不浪費任何東西;該模塊總是被完全導入(進入sys.modules映射),所以你使用import sys或者從sys導入argv沒有任何優勢。還有其他的模塊會在那裏,那麼爲什麼我不能使用sys.path。那是我的問題 –

回答

3

導入語句總是初始化整個模塊。這些模塊存儲在sys.modules dictionary中。

當您使用from sys import argvsys模塊本地綁定,只有argv是。您不能在模塊中使用名稱sys,因爲您沒有導入該名稱。

只能達到sys模塊,如果您單獨進口sys

from sys import argv 

script, input = argv 

import sys 
print sys.path 

而且你可以隨時通過訪問sys.modules訪問所有導入模塊:

from sys import modules 

print modules['sys'].path 

在這裏,我綁定的名稱modulessys.modules字典,並通過該參考找到sys模塊,並參考path屬性。

演示:

>>> from sys import modules 
>>> modules['sys'] 
<module 'sys' (built-in)> 
>>> sys 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'sys' is not defined 
+0

現在確定。之前你提到的鏈接,它被提到過。sys模塊的其餘部分仍然存在,無論你是否使用其他模塊。所以這條線實際上讓我困惑。所以現在我清楚,即使整個模塊可用,直到它不綁定到命名空間,它將無法工作。爲此我們需要再次導入sys –