分類: 程式設計

Python 以模組名稱 __name__ 分辨程式執行模式

這裡介紹如何以模組名稱 __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 官方文件

G. T. Wang

個人使用 Linux 經驗長達十餘年,樂於分享各種自由軟體技術與實作文章。

Share
Published by
G. T. Wang
標籤: Python

Recent Posts

光陽 KYMCO GP 125 機車接電發動、更換電瓶記錄

本篇記錄我的光陽 KYMCO ...

2 年 ago

[開箱] YubiKey 5C NFC 實體金鑰

本篇是 YubiKey 5C ...

2 年 ago

[DIY] 自製竹火把

本篇記錄我拿竹子加上過期的苦茶...

3 年 ago