摘要:原因很簡單,因為中的代表的就是當(dāng)前執(zhí)行的模塊名。缺點(diǎn)就是主程序會受待執(zhí)行程序的影響,會出現(xiàn)待執(zhí)行程序中拋異?;蛑鲃油顺鰰?dǎo)致主程序也退出的尷尬問題。總結(jié)來說就是,一個是在子進(jìn)程中執(zhí)行代碼,一個是在當(dāng)前進(jìn)程中執(zhí)行代碼。
相信剛接觸Python的你一定有過如此經(jīng)歷,把所有的代碼都寫在 if __name__ == "__main__" 下,因為有人告訴你,這樣比較符合 Pythonista 的代碼風(fēng)格。
殊不知這段代碼的意義并不是一定要存在于執(zhí)行代碼中,而是在日常工作中,為了調(diào)試某個模塊的正確性,我們往往會在當(dāng)前模塊下直接寫一個 if __name__ == "__main__" ,測試邏輯寫在下面,這樣,在其他模塊調(diào)用這個模塊里的方法也好,類也好的時候,就不會去調(diào)用 if __name__ == "__main__" 下面的邏輯了。
原因很簡單,因為 if __name__ == "__main__" 中的 __name__ 代表的就是當(dāng)前執(zhí)行的模塊名。
python一切皆對象,所以python的模塊也是對象,他有一個 built-in module,叫 __name__ ,存儲著模塊是如何被執(zhí)行的,如果是執(zhí)行當(dāng)前模塊,那么就顯示 __main__ ,如果是被引用進(jìn)來的,就顯示被引用的路徑。
好了,解釋完了這個奇妙的 __name__ 后,我們就來看下如何在其他模塊中調(diào)用這個 __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)」就是因為其實(shí)是通過創(chuàng)建一個子進(jìn)程來執(zhí)行的程序,所以不受子程序的影響,不會出現(xiàn)程序拋異?;蛑鲃油顺鲞M(jìn)程導(dǎo)致主程序也退出的尷尬問題。 「缺點(diǎn)」就是需要創(chuàng)建子進(jìn)程,相對來說資源消耗比較大。
subprocess 詳細(xì)的用法詳見這里不多做介紹,有興趣的可以自行翻閱manual。
接下來我們使用 runpy 模塊來調(diào)用看看
import runpy runpy.run_path("app.py", run_name="__main__")
調(diào)用結(jié)果
使用 runpy 的優(yōu)點(diǎn)就是不需要創(chuàng)建子進(jìn)程,相對來說資源消耗比較小。 缺點(diǎn)就是主程序會受待執(zhí)行程序的影響,會出現(xiàn)待執(zhí)行程序中拋異?;蛑鲃油顺鰰?dǎo)致主程序也退出的尷尬問題。
runpy 詳細(xì)的用法詳見這里不多做介紹,有興趣的可以自行翻閱manual。
這兩種方法就是比較常用的在一個模塊中執(zhí)行另一個模塊的 if __name__ == "__main__" 的方法。
總結(jié)來說就是,一個是在子進(jìn)程中執(zhí)行代碼,一個是在當(dāng)前進(jìn)程中執(zhí)行代碼。
好啦,今天的內(nèi)容就到這了,感興趣的你,可以試試能不能走出來~
注公眾號「Python專欄」,后臺回復(fù)「mainmodule」,獲取本文全套源碼!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/43419.html
摘要:代碼獲取設(shè)備列表信息獲取設(shè)備列表信息超時獲取所有已連接設(shè)備根據(jù)獲取單個當(dāng)前設(shè)備不存在序號為的設(shè)備請檢查連接獲取當(dāng)前屏幕圖像的字節(jié)數(shù)據(jù)保存圖像字節(jié)數(shù)據(jù)保存當(dāng)前屏幕對象將當(dāng)前屏幕圖像數(shù)據(jù)保存為圖片橫屏尺寸處理發(fā)生異常為空 部分代碼思路來源于互聯(lián)網(wǎng) 需求 之前一直在尋找一種完美的移動設(shè)備屏幕流回傳方案,這種嘗試一旦成功即可運(yùn)用于多種平臺,比如云端測試Portal中對機(jī)器設(shè)備屏幕的...
摘要:環(huán)境問題發(fā)現(xiàn)最近剛從換到下搬磚,發(fā)現(xiàn)在跑的好好的代碼,在下終端老是報錯還是編碼錯誤注冊失敗坦白說,看到這個錯誤好無奈。既然能在跑,換到就出錯,那多半是環(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)時是覺得沒啥用直接跳過了,這次準(zhǔn)備要仔細(xì)看一遍了,并記錄下一些心得。 前言 繼續(xù)向下看廖大教程,看到了函數(shù)式編程這一節(jié),當(dāng)時是覺得沒啥用直接跳過了,這次準(zhǔn)備要仔細(xì)看一遍了,并記錄下一些心得。 函數(shù)式編程 上學(xué)期有上一門叫 人工智能 的課,老師強(qiáng)行要我們學(xué)了一個叫做 prolog 的語言,哇那感覺確實(shí)難受,思維方式完全和之前學(xué)過的不一樣,...
摘要:傳送門這個就是主角歐拉函數(shù)。在數(shù)論中,對正整數(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)會出現(xiàn)所謂的歐拉函數(shù)(phi),在一篇論文中我需要對好幾個歐...
閱讀 3679·2021-11-16 11:45
閱讀 2470·2021-11-08 13:23
閱讀 2306·2021-10-11 10:59
閱讀 2977·2021-09-27 13:36
閱讀 2572·2019-08-30 15:54
閱讀 2746·2019-08-29 16:58
閱讀 2954·2019-08-29 16:56
閱讀 1454·2019-08-26 13:52