相信剛接觸Python的你一定有過如此經歷,把所有的代碼都寫在 if __name__ == '__main__'
下,因為有人告訴你,這樣比較符合 Pythonista 的代碼風格。
殊不知這段代碼的意義並不是一定要存在於執行代碼中,而是在日常工作中,為了調試某個模塊的正確性,我們往往會在當前模塊下直接寫一個 if __name__ == '__main__'
,測試邏輯寫在下面,這樣,在其他模塊調用這個模塊里的方法也好,類也好的時候,就不會去調用 if __name__ == '__main__'
下面的邏輯了。
原因很簡單,因為 if __name__ == '__main__'
中的 __name__
代表的就是當前執行的模塊名。
python一切皆對象,所以python的模塊也是對象,他有一個 built-in module,叫 __name__
,存儲着模塊是如何被執行的,如果是執行當前模塊,那么就顯示 __main__
,如果是被引用進來的,就顯示被引用的路徑。
好了,解釋完了這個奇妙的 __name__
后,我們就來看下如何在其他模塊中調用這個 __main__
呢?
首先來看下我們待被執行的代碼:
import sys
def main(args):
print(args)
if __name__ == '__main__':
print("執行如下代碼 __name__ == '__main__'")
# 參數隨便指定即可
main(sys.argv[1:])
我們來執行看下結果:
接下來我們來使用 subprocess 模塊來從其他模塊中調用 __main__
import subprocess
process = subprocess.run(
['python', 'app.py', 'miracle'],
stdin=subprocess.PIPE, stdout=subprocess.PIPE
)
print(process.stdout)
調用結果
使用 subprocess 的「優點」就是因為其實是通過創建一個子進程來執行的程序,所以不受子程序的影響,不會出現程序拋異常或主動退出進程導致主程序也退出的尷尬問題。 「缺點」就是需要創建子進程,相對來說資源消耗比較大。
subprocess 詳細的用法詳見這里不多做介紹,有興趣的可以自行翻閱manual。
接下來我們使用 runpy 模塊來調用看看
import runpy
runpy.run_path('app.py', run_name='__main__')
調用結果
使用 runpy 的優點就是不需要創建子進程,相對來說資源消耗比較小。 缺點就是主程序會受待執行程序的影響,會出現待執行程序中拋異常或主動退出會導致主程序也退出的尷尬問題。
runpy 詳細的用法詳見這里不多做介紹,有興趣的可以自行翻閱manual。
這兩種方法就是比較常用的在一個模塊中執行另一個模塊的 if __name__ == '__main__'
的方法。
總結來說就是,一個是在子進程中執行代碼,一個是在當前進程中執行代碼。
好啦,今天的內容就到這了,感興趣的你,可以試試能不能走出來~
注公眾號「Python專欄」,后台回復「mainmodule」,獲取本文全套源碼!
