1. 程式人生 > >昨天2年python開發的同事,還在問我 if __name__ == ‘__main__‘ 是什麽

昨天2年python開發的同事,還在問我 if __name__ == ‘__main__‘ 是什麽

資料 nis pytho 學習者 python學習 path ref 原因 ogr

相信剛接觸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的時候肯定會遇到很多難題,以及對於新技術的追求,這裏推薦一下我們的Python學習扣qun:784758214,這裏是python學習者聚集地!!同時,自己是一名高級python開發工程師,從基礎的python腳本到web開發、爬蟲、django、數據挖掘等,零基礎到項目實戰的資料都有整理。送給每一位python的小夥伴!每日分享一些學習的方法和需要註意的小細節

點擊:python技術分享交流

技術分享圖片

昨天2年python開發的同事,還在問我 if __name__ == ‘__main__‘ 是什麽