2014-03-25 57 views
0

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

我理解了它的一些部分,但它對我來說還是不完全清楚。我主要對初始化步驟感到困惑,最後它說重複一些步驟。我理解的唯一事情是,如果我們使用say例如:

import sys 
中,如果我們使用這個模塊中我們的腳本的功能,我們需要給他們打電話使用sys.fun_name()這種情況下

。由於這些功能在本地無法使用這個導入語句提供。 但是,當我們使用

from sys import argv 

我們可以簡單地使用argv的功能,因爲它使得可用的本地的出srcipt。

有人可以請解釋我的工作,並讓我知道我的理解是正確與否。

即使我試圖導入我的腳本到另一個腳本之一,它給了一些奇怪的結果,我知道有些事情要與import語句的第一步,(initiallization)

##### ex17.py ##### 
def print_two(*args): 
arg1, arg2 = args 
print "arg1: %r, arg2: %r" %(arg1, arg2) 

def print_two_again(arg1, arg2): 
print "arg1: %r, arg2: %r" %(arg1, arg2) 

def print_one(arg1): 
print "arg1: %r" %arg1 

def print_none(): 
print "I got nothing." 

print_two("Gaurav","Pareek") 
print_two_again("Gaurav","Pareek") 
print_one("First!") 
print_none() 

####### ex18.py ###### 
import ex17 
ex17.print_none() 

的輸出,我在執行ex18.py時得到如下

arg1: 'Gaurav', arg2: 'Pareek' 
arg1: 'Gaurav', arg2: 'Pareek' 
arg1: 'First!' 
I got nothing. 
I got nothing. 

爲什麼它是這樣的。它應該只打印我沒有得到一次。

回答

0

它打印"I got nothing."兩次,因爲功能print_none被調用兩次。一旦加載ex17模塊(因爲它是在ex18中導入的),以及在ex18模塊中調用一次時。如果你不想在EX17的函數調用來執行,但只有功能DEFS被加載,那麼你可以按照如下

## in ex17.py 

if __name__ == '__main__': 
    print_two("Gaurav","Pareek") 
    print_two_again("Gaurav","Pareek") 
    print_one("First!") 
    print_none() 

現在,如果它運行的腳本,即這個代碼纔會執行​​寫他們。 $ python ex17.py,但不是當它被導入到其他模塊時。關於__main__的更多信息here

關於文檔摘錄,它只是說明兩種導入格式有何不同。第1步負責查找和初始化模塊,第2步負責將名稱添加到本地名稱空間。所以如果是,

import sys 

步驟1和2都會執行一次。但在,情況

from sys import argv, stdout 

步驟1將只執行一次,而第2步將被執行的兩倍,它需要雙方argvstdout添加到本地命名空間。

+0

__main__將只爲打印一次。但我不認爲在導入sys的情況下,兩個步驟將被執行一次。我的理解是,當你說import sys,os然後步驟1將被執行兩個模塊sys和os。然後重複步驟2,以獲得sys和os模塊中可用的所有功能。 –

+0

但是從sys導入argv,stdout將只執行一次步驟1,而對於這兩個函數只有argv和stdout會重複執行步驟2。讓我知道我是否正確或錯誤。 –

+0

對於'import sys,os',兩個步驟將執行兩次(從文檔:「對列表中的每個標識符重複這些步驟」)。在這個特定的例子中,第2步只將sys和os添加到本地命名空間,而不是所有的代碼。這就是爲什麼我們需要以「sys.argv」或「or.path.join」等方式訪問代碼(注意:按照[PEP-8](http:// legacy.python.org/dev/peps/pep-0008/#imports)) – naiquevin