__main__
— Top-level script environment
'__main__'是頂級代碼執行的作用域的名字。
當一個模塊從標准input, 一個腳本文件,或一個交互命令read讀入時,它的__name__等於'__main__'。
程序入口
C 和 C++ 都需要有一個 main 函數來作為程序的入口,也就是程序的運行會從 main 函數開始。同樣,Java 和 C# 必須要有一個包含 Main 方法的主類來作為程序入口。
#include <stdio.h> int main() { /* 我的第一個 C 程序 */ printf("Hello, World! \n"); return 0; }
而 Python 則有不同,它屬於腳本語言,不像編譯型語言那樣先將程序編譯成二進制再運行,而是動態的逐行解釋運行。也就是從腳本第一行開始運行,沒有統一的入口。
一個 Python 源碼文件除了可以被直接運行外,還可以作為模塊(也就是庫)被導入。不管是導入還是直接運行,最頂層的代碼都會被運行(Python 用縮進來區分代碼層次)。而實際上在導入的時候,有一部分代碼我們是不希望被運行的。
例如,下面的例子。
#linshi.py PI = 3.14 def main(): print ("PI:", PI)
main()
#example.py from linshi import PI def calc_round_area(radius): return PI * (radius ** 2) def main(): print ("round area: ", calc_round_area(2)) main()
執行python3 example.py后在輸出:
PI: 3.14
round area: 12.56
這是因為linshi.py中有main()這行代碼。實際上不希望運行linshi.py中的main函數。修改linshi.py:
PI = 3.14 def main(): print ("PI:", PI) # main() 加上一個判斷: if __name__ == '__main__': main()
解釋:
example.py從命令行read時,__name__就等於'__main__'。
linshi.py作為模塊導入時,__name__則被賦值為模塊自身的名字,即linshi。
Python -m 參數解析
https://a7744hsc.github.io/python/2018/05/03/Run-python-script.html