摘要:原因很簡(jiǎn)單,因?yàn)橹械拇淼木褪钱?dāng)前執(zhí)行的模塊名。缺點(diǎn)就是主程序會(huì)受待執(zhí)行程序的影響,會(huì)出現(xiàn)待執(zhí)行程序中拋異常或主動(dòng)退出會(huì)導(dǎo)致主程序也退出的尷尬問題。總結(jié)來說就是,一個(gè)是在子進(jìn)程中執(zhí)行代碼,一個(gè)是在當(dāng)前進(jìn)程中執(zhí)行代碼。
相信剛接觸Python的你一定有過如此經(jīng)歷,把所有的代碼都寫在 if __name__ == "__main__" 下,因?yàn)橛腥烁嬖V你,這樣比較符合 Pythonista 的代碼風(fēng)格。
殊不知這段代碼的意義并不是一定要存在于執(zhí)行代碼中,而是在日常工作中,為了調(diào)試某個(gè)模塊的正確性,我們往往會(huì)在當(dāng)前模塊下直接寫一個(gè) if __name__ == "__main__" ,測(cè)試邏輯寫在下面,這樣,在其他模塊調(diào)用這個(gè)模塊里的方法也好,類也好的時(shí)候,就不會(huì)去調(diào)用 if __name__ == "__main__" 下面的邏輯了。
原因很簡(jiǎn)單,因?yàn)?if __name__ == "__main__" 中的 __name__ 代表的就是當(dāng)前執(zhí)行的模塊名。
python一切皆對(duì)象,所以python的模塊也是對(duì)象,他有一個(gè) built-in module,叫 __name__ ,存儲(chǔ)著模塊是如何被執(zhí)行的,如果是執(zhí)行當(dāng)前模塊,那么就顯示 __main__ ,如果是被引用進(jìn)來的,就顯示被引用的路徑。
好了,解釋完了這個(gè)奇妙的 __name__ 后,我們就來看下如何在其他模塊中調(diào)用這個(gè) __main__ 呢?
首先來看下我們待被執(zhí)行的代碼:
import sys def main(args): print(args) if __name__ == "__main__": print("執(zhí)行如下代碼 __name__ == "__main__"") # 參數(shù)隨便指定即可 main(sys.argv[1:])
我們來執(zhí)行看下結(jié)果:
接下來我們來使用 subprocess 模塊來從其他模塊中調(diào)用 __main__
import subprocess process = subprocess.run( ["python", "app.py", "miracle"], stdin=subprocess.PIPE, stdout=subprocess.PIPE ) print(process.stdout)
調(diào)用結(jié)果
使用 subprocess 的「優(yōu)點(diǎn)」就是因?yàn)槠鋵?shí)是通過創(chuàng)建一個(gè)子進(jìn)程來執(zhí)行的程序,所以不受子程序的影響,不會(huì)出現(xiàn)程序拋異常或主動(dòng)退出進(jìn)程導(dǎo)致主程序也退出的尷尬問題。 「缺點(diǎn)」就是需要?jiǎng)?chuàng)建子進(jìn)程,相對(duì)來說資源消耗比較大。
subprocess 詳細(xì)的用法詳見這里不多做介紹,有興趣的可以自行翻閱manual。
接下來我們使用 runpy 模塊來調(diào)用看看
import runpy runpy.run_path("app.py", run_name="__main__")
調(diào)用結(jié)果
使用 runpy 的優(yōu)點(diǎn)就是不需要?jiǎng)?chuàng)建子進(jìn)程,相對(duì)來說資源消耗比較小。 缺點(diǎn)就是主程序會(huì)受待執(zhí)行程序的影響,會(huì)出現(xiàn)待執(zhí)行程序中拋異常或主動(dòng)退出會(huì)導(dǎo)致主程序也退出的尷尬問題。
runpy 詳細(xì)的用法詳見這里不多做介紹,有興趣的可以自行翻閱manual。
這兩種方法就是比較常用的在一個(gè)模塊中執(zhí)行另一個(gè)模塊的 if __name__ == "__main__" 的方法。
總結(jié)來說就是,一個(gè)是在子進(jìn)程中執(zhí)行代碼,一個(gè)是在當(dāng)前進(jìn)程中執(zhí)行代碼。
好啦,今天的內(nèi)容就到這了,感興趣的你,可以試試能不能走出來~
注公眾號(hào)「Python專欄」,后臺(tái)回復(fù)「mainmodule」,獲取本文全套源碼!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/43419.html
摘要:代碼獲取設(shè)備列表信息獲取設(shè)備列表信息超時(shí)獲取所有已連接設(shè)備根據(jù)獲取單個(gè)當(dāng)前設(shè)備不存在序號(hào)為的設(shè)備請(qǐng)檢查連接獲取當(dāng)前屏幕圖像的字節(jié)數(shù)據(jù)保存圖像字節(jié)數(shù)據(jù)保存當(dāng)前屏幕對(duì)象將當(dāng)前屏幕圖像數(shù)據(jù)保存為圖片橫屏尺寸處理發(fā)生異常為空 部分代碼思路來源于互聯(lián)網(wǎng) 需求 之前一直在尋找一種完美的移動(dòng)設(shè)備屏幕流回傳方案,這種嘗試一旦成功即可運(yùn)用于多種平臺(tái),比如云端測(cè)試Portal中對(duì)機(jī)器設(shè)備屏幕的...
摘要:環(huán)境問題發(fā)現(xiàn)最近剛從換到下搬磚,發(fā)現(xiàn)在跑的好好的代碼,在下終端老是報(bào)錯(cuò)還是編碼錯(cuò)誤注冊(cè)失敗坦白說,看到這個(gè)錯(cuò)誤好無奈。既然能在跑,換到就出錯(cuò),那多半是環(huán)境問題了,然后我就開始了我的調(diào)試追蹤之旅了跟蹤調(diào)試先前調(diào)試都是一晃而過,只看結(jié)果。 環(huán)境:mac 10.12 python3 django 1.10 問題發(fā)現(xiàn) 最近剛從arch 換到 mac下搬磚, 發(fā)現(xiàn)在arch跑的好好的代碼,...
摘要:前言繼續(xù)向下看廖大教程,看到了函數(shù)式編程這一節(jié),當(dāng)時(shí)是覺得沒啥用直接跳過了,這次準(zhǔn)備要仔細(xì)看一遍了,并記錄下一些心得。 前言 繼續(xù)向下看廖大教程,看到了函數(shù)式編程這一節(jié),當(dāng)時(shí)是覺得沒啥用直接跳過了,這次準(zhǔn)備要仔細(xì)看一遍了,并記錄下一些心得。 函數(shù)式編程 上學(xué)期有上一門叫 人工智能 的課,老師強(qiáng)行要我們學(xué)了一個(gè)叫做 prolog 的語言,哇那感覺確實(shí)難受,思維方式完全和之前學(xué)過的不一樣,...
摘要:傳送門這個(gè)就是主角歐拉函數(shù)。在數(shù)論中,對(duì)正整數(shù),歐拉函數(shù)是小于或等于的正整數(shù)中與互質(zhì)的數(shù)的數(shù)目。歐拉函數(shù)實(shí)際上是模的同余類所構(gòu)成的乘法群即環(huán)的所有單位元組成的乘法群的階。 歐拉函數(shù)(Euler totient function ) Author: Jasper Yang School: Bupt 前言 gamma函數(shù)的求導(dǎo)會(huì)出現(xiàn)所謂的歐拉函數(shù)(phi),在一篇論文中我需要對(duì)好幾個(gè)歐...
閱讀 3564·2021-11-16 11:45
閱讀 2099·2021-11-08 13:23
閱讀 2212·2021-10-11 10:59
閱讀 2892·2021-09-27 13:36
閱讀 2481·2019-08-30 15:54
閱讀 2669·2019-08-29 16:58
閱讀 2783·2019-08-29 16:56
閱讀 1342·2019-08-26 13:52