簡體   English   中英

如何導入需要 __name__ == "__main__" 的腳本

[英]How to import script that requires __name__ == "__main__"

我對 Python 很陌生,這個問題可能表明了這一點。 我正在處理我的腳本的多處理部分,找不到我的問題的明確答案。

我正在為一件事而苦苦掙扎。 使用多處理時,必須使用 if __name__ == "__main__"保護部分代碼。 我明白了,我的游泳池工作得很好。 但我很想導入整個腳本(讓它成為一個返回參數的大 function 是最好的)。 這就是問題所在。 首先,如果由於那個守衛,它的一部分只能在從主/源文件啟動時運行,我該如何導入? 其次,如果我設法解決它並且整個腳本將在一個大 function 中,pickle 無法處理,將使用“多處理蒔蘿”或“pathos”修復它嗎?

謝謝!

您可能對這個概念感到困惑。 Python 中的if __name__ == "__main__"保護正是為了讓所有 Python 文件都可以導入而存在。

如果沒有警衛,文件一旦導入,將具有與“根”程序相同的行為- 並且需要大量的 boiler 板和進程間通信(例如在固定位置寫入“PID”文件)文件系統位置)來協調相同代碼的導入,包括多處理。

只需將需要為根進程運行的任何代碼置於保護之下。 您移動到可以從導入代碼調用的函數中的所有其他內容。

如果您運行“所有”腳本,即使設置多處理工作人員的部分也會運行,並且任何簡單的工作都會以指數方式創建更多工作人員,直到所有機器資源都被占用(即:它會快速崩潰,可能會占用機進入無響應狀態)。

所以,這是一個很好的模式 - “dothejob” function 可以調用您需要的所有其他功能,因此您只需從主進程或任何其他項目導入並調用它,將您的文件作為 Python 模塊導入。


import multiprocessing
...
def dothejob():
   ...

def start():
   # code to setup and start multiprocessing workers:
   # like:
   worker1 = multiprocessing.Process(target=dothejob)
   ...
   worker1.start()
   ...
   worker1.join()

if __name__ == "__main__":
   start()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM