這裡介紹如何以模組名稱 __name__ 變數分辨程式執行模式,判斷程式是否處於被引入(import)的狀態。

在 Python 程式中時常可以看到 __name__ == "__main__" 這個奇怪的判斷式,類似這樣:

Python 指令稿

以下我們將介紹這個判斷式的意義及使用方式。

__main__ 最上層變數範圍

'__main__' 是 Python 程式最上層的變數範圍(scope)名稱,在以下三種狀況下,Python 的模組名稱 __name__ 會被設定為 '__main__'

  1. 透過標準輸入(standard input)讀取 Python 程式碼來執行程式。
  2. 在 Python 互動式的環境中,直接輸入程式碼來執行。
  3. 使用 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 的 __name__

參考資料:Python 官方文件