2015-02-05 75 views
0

我已經走了那麼多文章對此如果__name__ ==「__main__」蟒蛇

if __name__ == '__main__' 

,但沒有得到它..我要分享你的代碼,請你能更簡單地解釋。 。

我已經創建了一個文件 「ab.py」

def a(): 
    print('A function in ab file'); 

a() 

第二個文件是 「xy.py」

import ab 

def b(): 
    print('b function') 

def x(): print ('s'); 

x() 

if __name__ == "__main__" :b() 

當我執行這個代碼,那麼這個輸出快到

A function in ab file 
s 
b function 

現在我想知道這是什麼意思,什麼是真正做這個代碼,爲什麼我們實現這個?我們的代碼是工作,而這也

if __name__ == "__main__" :b() 
+3

可能的重複http://stackoverflow.com/questions/419163/what-does-if-name-main-do – ozgur

+0

我確實從這裏得到它:(我已經讀了 –

+0

這就像'main(String [] args)'在Java或C# – Radinator

回答

2

任何東西來後if __name__ == '__main__':將運行,當你明確地運行您的文件。

python myfile.py 

但是,如果您導入myfile.py別處:if __name__ == '__main__':

import myfile 

什麼都不會被調用。

你應該習慣於總是使用它。

2

究竟是在做這個代碼?

當您執行xy.py時,會導入ab。 import語句在導入時運行模塊,因此ab的操作在xy的剩餘部分之前執行。一旦完成了ab,它繼續xy。

解釋器會跟蹤哪些腳本正在運行__name__。當你運行一個腳本時 - 不管你命名了它 - 解釋器稱它爲"__main__"。這就是它如何跟蹤哪個腳本是主文件,這是在外部調用另一個腳本後返回的腳本。 (您可能會說'home'腳本。)從'main'腳本調用的任何其他腳本的文件名都是__name__。因此,行if __name__ == "__main__" :是解釋器的測試,用於確定它是在它正在查看的腳本(解析)上運行,還是暫時窺探到另一個腳本。這使程序員可以靈活地讓腳本在外部調用時表現不同。

要了解發生了什麼,請首先關注無縮略的行及其在腳本中的顯示順序。請記住,函數 - 或def - 塊在調用之前不會自行執行任何操作。口譯員可能會認爲如果嘟to到自己:

  • 打開xy.py.
  • 導入並使用__name__ ab.py打開文件。
  • 哦,一個函數。我會記住的。
  • 好的,function a();我剛剛瞭解到。我想我現在會打印。
  • 文件結束;回到'__main__'
  • 哦,一個函數。我會記住的。
  • 另一個。
  • Function x();好吧,打印''。
  • 這是什麼?一個if聲明。那麼,條件已經滿足(變量__name__已被設置爲'__main__'),所以我會打印'B功能'。

但是我認爲你沒有正確使用它。可能有例外,但底部兩行應該是:

if __name__ == "__main__": 
main() 

...這意味着「如果是這樣的‘主’或家庭腳本,執行所謂的main()功能這就是爲什麼你會看到一個。 def main():塊往上頂,其中包含的腳本功能的主流。

爲什麼我們實現這個?

(哇,我竟然想通了這部分了,而寫上面,這是部分我真的很掙扎導致瞭解,因爲我從來沒有寫過一個腳本,其中包含我從其他腳本調用的函數。)

請記住我剛纔所說的關於import語句的內容嗎?導入模塊時,它不會「識別」它,並等待進一步的指示。它實際上運行腳本中包含的所有可執行操作。因此,將腳本中的內容放入main()函數可以有效隔離它,並將其隔離,以便在由其他腳本導入時不會立即運行它。

同樣,會有例外,但通常的做法是main()通常不會從外部調用。所以你可能想知道另外一件事:如果我們不打電話給main(),爲什麼我們要調用腳本?這是因爲許多人用自己構建的獨立函數來構建腳本。然後他們被稱爲腳本正文的其他地方。這使我想到這一點:

我們的代碼是工作,而這也

是的,你說得對。這些單獨的函數可以從main()函數中不包含的內聯腳本調用。如果你習慣於(像我一樣,在編程的早期學習階段)去構建完全符合你需要的內聯腳本,並且如果你再次需要這種操作,那麼你會試着再次弄清楚它 - 好吧,你不習慣這種內部結構來編寫代碼,因爲編譯起來比較複雜,而且閱讀起來不太直觀。但是,這是一個,可能不能有外部調用它的功能,因爲如果沒有它會開始計算和分配變量腳本。如果你試圖重新使用一個函數,那麼很可能你的新腳本與舊腳本的關係足夠緊密,以至於可能存在相互衝突的變量。

我應該說,順便說一句,this thread包含@kindall答案終於讓我明白 - 該幹嘛,而不是如何。不幸的是,它被標記爲this one的重複,我認爲這是一個錯誤。 (我是這個板子的新手,所以不能標記它;如果您同意我的意見,請將其標記爲獲得進一步的注意)

0

簡而言之,if __name__ == "__main__":中的所有內容僅在模塊直接執行時纔會運行通過python解釋器(例如:python module.py)或者在導入後顯式調用函數。

實施例: testFile.py

#this will always be executed even if this module is simply imported by other file or this module is the entry point 
print "I will always run in any situation. Even when this module is 'just' imported" 

if __name__ == "__main__": 
    #this will be executed only when this module is the entry point eg. python testFile.py but not if this file is imported 
    print "I will only run if this module (testFile.py) is executed directly by python interpreter" 

app.py

import testFile 

testFile.py

輸出: 我會永遠在任何情況下運行。即使這個模塊 '只是' 進口

如果這個模塊(testFile.py)由Python解釋器


蟒蛇 app.py

輸出直接執行我將只運行: 我將永遠在任何情況下運行。即使這個模塊是「只是」進口


,如果你想了解的 __name__可變的內部

: 檢查這個What does if __name__ == "__main__": do?

1

一個非常簡單的例子來理解這句話是以下幾點:

假設我們有下列名爲的python腳本:'using_name。PY」


# Filename: using_name.py 

if __name__ == '__main__': 
    print 'This program is being run by itself' 
else: 
    print 'I am being imported from another module' 

現在,試着做以下兩件事情,看看會發生什麼:


1)直接運行該腳本

$ python using_name.py 

結果

This program is being run by itself 

2)導入腳本

$ python 
import using_name 

結果

I am being imported from another module