2010-10-28 68 views
188

什麼是__main__.py文件,我應該把什麼樣的代碼放進去,什麼時候應該放一個?什麼是__main__.py?

+0

'__init __。py'服務的目的不同於'__main __。py' - 並不真正理解爲什麼這被標記爲重複。 RAS,你能解釋一下嗎? – 2017-10-14 13:26:38

回答

193

通常情況下,一個Python程序由命令行上命名.py文件運行:

$ python my_program.py 

您還可以創建一個目錄或壓縮文件的完整代碼,包括__main__.py。然後,你可以簡單地命名的目錄或zip文件在命令行上,並自動執行__main__.py

$ python my_program_dir 
$ python my_program.zip 
# Or, if the program is accessible as a module 
$ python -m my_program 

你必須自己決定你的應用程序是否能夠從這樣的正在執行中獲益。

18

__main__.py用於zip文件中的python程序。當運行zip文件時,__main__.py文件將被執行。例如,如果壓縮文件是這樣:

test.zip 
    __main__.py 

__main__.py內容是

import sys 
print "hello %s" % sys.argv[1] 

然後如果我們運行python test.zip world我們會得到hello world出來。

因此,__main__.py文件在zip文件上調用python時運行。

11

如果您的腳本是一個目錄或ZIP文件而不是一個Python文件,當「腳本」作爲參數傳遞給python解釋器時,將會執行__main__.py

12

創建__main__.pyyourpackage使其可執行文件:

$ python -m yourpackage 
42

什麼是__main__.py文件?

當創建Python模塊時,通常使模塊在作爲程序的入口點運行時執行某些功能(通常包含在main函數中)。這通常是與放置在最Python文件底部以下常見成語做:

if __name__ == '__main__': 
    # execute only if run as the entry point into the program 
    main() 

你可以得到一個Python包相同的語義與__main__.py。這是Linux命令提示符下,$,如果你沒有在Windows擊(或其他Posix的外殼)就在demo/__<init/main>__.py with contents in between the EOF`s創建這些文件:

$ mkdir demo 
$ cat > demo/__init__.py << EOF 
print('demo/__init__.py executed') 
def main(): 
    print('main executed') 
EOF 
$ cat > demo/__main__.py << EOF 
print('demo/__main__.py executed') 
from __init__ import main 
main() 
EOF 

(在一個POSIX/Bash shell中,你能做到以上沒有<< EOF S和按下Ctrl-d,結束文件的字符結束EOF S,在每個cat命令結束)

現在:

$ python demo 
demo/__main__.py executed 
demo/__init__.py executed 
main executed 

你可以從文檔中導出離子。該documentation說:

__main__ - 頂層腳本環境

'__main__'是在頂級代碼執行範圍的名稱。 當從標準 輸入,腳本或交互式提示中讀取時,模塊的__name__設置爲等於'__main__'

模塊可以通過檢查自己的__name__,允許 一個常見的成語有條件地執行代碼的模塊中,當它運行的腳本或 與python -m,但發現它是否在範圍主要 運行不是當它被導入:

if __name__ == '__main__': 
     # execute only if run as a script 
     main() 

對於打包,相同的效果可以通過包括 __main__.py模塊,其內容在當模塊與-m運行將被執行而實現。

拉鍊

您也可以打包這成一個單一的文件,並從這樣的命令行運行它 - 但是請注意,壓縮包無法執行子包或子模塊的入口點:

$ python -m zipfile -c demozip demo/* 
$ python demozip 
demo/__main__.py executed 
demo/__init__.py executed 
main() executed 
相關問題