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

在這裏插入圖片描述

相信剛接觸Python的你必定有過如此經歷,把全部的代碼都寫在 if __name__ == '__main__' 下,由於有人告訴你,這樣比較符合 Pythonista 的代碼風格。python

卻不知這段代碼的意義並非必定要存在於執行代碼中,而是在平常工做中,爲了調試某個模塊的正確性,咱們每每會在當前模塊下直接寫一個 if __name__ == '__main__' ,測試邏輯寫在下面,這樣,在其餘模塊調用這個模塊裏的方法也好,類也好的時候,就不會去調用 if __name__ == '__main__' 下面的邏輯了。app

緣由很簡單,由於 if __name__ == '__main__' 中的 __name__ 表明的就是當前執行的模塊名。測試

python一切皆對象,因此python的模塊也是對象,他有一個 built-in module,叫 __name__ ,存儲着模塊是如何被執行的,若是是執行當前模塊,那麼就顯示 __main__ ,若是是被引用進來的,就顯示被引用的路徑。ui

python

好了,解釋完了這個奇妙的 __name__ 後,咱們就來看下如何在其餘模塊中調用這個 __main__ 呢?調試

首先來看下咱們待被執行的代碼:code

import sys

def main(args):
  print(args)

if __name__ == '__main__':
  print("執行以下代碼 __name__ == '__main__'")
  # 參數隨便指定便可
  main(sys.argv[1:])

咱們來執行看下結果:對象

python

接下來咱們來使用 subprocess 模塊來從其餘模塊中調用 __main__blog

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專欄二維碼

相關文章
相關標籤/搜索