這裡介紹如何以模組名稱 __name__
變數分辨程式執行模式,判斷程式是否處於被引入(import)的狀態。
在 Python 程式中時常可以看到 __name__ == "__main__"
這個奇怪的判斷式,類似這樣:
以下我們將介紹這個判斷式的意義及使用方式。
__main__
最上層變數範圍
'__main__'
是 Python 程式最上層的變數範圍(scope)名稱,在以下三種狀況下,Python 的模組名稱 __name__
會被設定為 '__main__'
:
- 透過標準輸入(standard input)讀取 Python 程式碼來執行程式。
- 在 Python 互動式的環境中,直接輸入程式碼來執行。
- 使用 Python 指令稿執行程式。
判斷程式是否被引入(import)
如果有一個指令稿 my_module.py
,其內容如下:
# my_module.py
print "__name__ = " + __name__
這個簡單的 Python 執行後會輸出 __name__
的值,若以 Python 直接執行這個指令稿,它的值會是 __main__
:
python my_module.py
__name__ = __main__
但如果這時候我們建立另外一個指令稿 app.py
,內容如下:
# app.py import my_module
在這個 app.py
中我們引入(import)了 my_module.py
,在這種狀況下執行 my_module.py
的話,其中的 __name__
值就會不同:
python app.py
__name__ = my_module
如果 Python 程式碼處於被引入的模組中,那麼它的 __name__
值就會是該模組的名稱。
因為這個特性,我們可以靠著檢查 __name__
的值是否為 '__main__'
,來判斷 Python 程式是處於獨立執行的狀態,還是被其他 Python 程式引入(import)的。
if __name__ == "__main__": # 獨立執行時,所要執行的程式碼 # ...
至於透過標準輸入與互動式環境輸入 Python 程式碼時,__name__
的值都會是 __main__
,不過在這兩種執行狀況比較少會使用到 __name__
的值,以下是這兩種狀況的執行範例:
參考資料:Python 官方文件