寫了2年python,知道 if __name__ == '__main__' 什麼意思嗎?

上海小小胖發表於2019-03-21

在這裡插入圖片描述

相信剛接觸Python的你一定有過如此經歷,把所有的程式碼都寫在 if __name__ == '__main__'下,因為有人告訴你,這樣比較符合 Pythonista 的程式碼風格。

殊不知這段程式碼的意義並不是一定要存在於執行程式碼中,而是在日常工作中,為了除錯某個模組的正確性,我們往往會在當前模組下直接寫一個 if __name__ == '__main__',測試邏輯寫在下面,這樣,在其他模組呼叫這個模組裡的方法也好,類也好的時候,就不會去呼叫 if __name__ == '__main__' 下面的邏輯了。

原因很簡單,因為 if __name__ == '__main__' 中的 __name__ 代表的就是當前執行的模組名。

python一切皆物件,所以python的模組也是物件,他有一個 built-in module,叫 __name__,儲存著模組是如何被執行的,如果是執行當前模組,那麼就顯示 __main__ ,如果是被引用進來的,就顯示被引用的路徑。

python

好了,解釋完了這個奇妙的 __name__ 後,我們就來看下如何在其他模組中呼叫這個 __main__ 呢?

首先來看下我們待被執行的程式碼:

import sys

def main(args):
  print(args)

if __name__ == '__main__':
  print("執行如下程式碼 __name__ == '__main__'")
  # 引數隨便指定即可
  main(sys.argv[1:])
複製程式碼

我們來執行看下結果:

python

接下來我們來使用 subprocess 模組來從其他模組中呼叫 __main__

import subprocess

process = subprocess.run(
  ['python', 'app.py', 'miracle'],
  stdin=subprocess.PIPE, stdout=subprocess.PIPE
)
print(process.stdout)
複製程式碼

呼叫結果

python

使用 subprocess 的「優點」就是因為其實是通過建立一個子程式來執行的程式,所以不受子程式的影響,不會出現程式拋異常或主動退出程式導致主程式也退出的尷尬問題。 「缺點」就是需要建立子程式,相對來說資源消耗比較大。

subprocess 詳細的用法詳見這裡不多做介紹,有興趣的可以自行翻閱manual。

接下來我們使用 runpy 模組來呼叫看看

import runpy

runpy.run_path('app.py', run_name='__main__')
複製程式碼

呼叫結果

python

使用 runpy 的優點就是不需要建立子程式,相對來說資源消耗比較小。 缺點就是主程式會受待執行程式的影響,會出現待執行程式中拋異常或主動退出會導致主程式也退出的尷尬問題。

runpy 詳細的用法詳見這裡不多做介紹,有興趣的可以自行翻閱manual。

這兩種方法就是比較常用的在一個模組中執行另一個模組的 if __name__ == '__main__' 的方法。 總結來說就是,一個是在子程式中執行程式碼,一個是在當前程式中執行程式碼。

好啦,今天的內容就到這了,感興趣的你,可以試試能不能走出來~

注公眾號「Python專欄」,後臺回覆「mainmodule」,獲取本文全套原始碼!

Python專欄二維碼

相關文章