[英]Multiprocessing python within frozen script
我正在嘗試將使用multiprocessing
的腳本編譯成Windows可執行文件。 起初我遇到了同樣的問題,因為當我將其編譯成可執行文件時, 在Windows上調用多處理模塊的函數時 , 為什么python可執行文件會打開新的窗口實例 。 按照接受的答案,我調整了我的腳本
from multiprocessing import freeze_support
# my functions
if __name__ == "__main__":
freeze_support()
# my script
當作為腳本運行時,這再次完美地運行。 但是,當我編譯並運行它時遇到:
我在錯誤的綠色部分加下划線。 這個具體的行是指
freeze_support()
在我的腳本中。 此外,它在這一行上實際上並沒有遇到,但是當我的腳本進入多進程時,它是這樣的:
p = multiprocessing.Process(target=my_function, args=[my_list])
p.start()
p1 = multiprocessing.Process(target=my_function, args=[my_list])
p1.start()
p.join()
p1.join()
這是多處理模塊中的錯誤(特別是第148行)還是我誤解了我鏈接的答案或其他什么?
我還會注意到編譯時腳本可以正常工作,但是對於每個生成的多個進程(非常多),您必須在錯誤消息上單擊“確定”,並且每個錯誤消息都完全相同。 這是否意味着我使用p.join()
不正確地結束了這個過程?
我也嘗試過Python 3.4的解決方案多處理不適用於建議添加的py2exe
multiprocessing.set_executable(os.path.join(sys.exec_prefix, 'pythonw.exe'))
到你的腳本,但這導致腳本形式(甚至尚未編譯)的錯誤:
FileNotFoundError:[WinError 2]系統找不到指定的文件
謝謝您的幫助!
freeze_support文檔: https ://docs.python.org/2/library/multiprocessing.html#multiprocessing.freeze_support
這似乎是一個問題很長一段時間 - 我發現至少可以追溯到2014年。 由於它似乎是無害的,因此一般建議通過用虛擬替換sys.stdout
(以及在下一行刷新的sys.stderr
)來抑制錯誤。 試試這個:
import os
import sys
from multiprocessing import freeze_support
if __name__ == '__main__':
if sys.stdout is None:
sys.stdout = sys.stderr = open(os.devnull, 'w')
freeze_support()
這不是多處理庫或py2exe本身的問題,而是運行應用程序的方式的副作用。 py2exe文檔包含有關此主題的一些討論:
在Windows下運行的程序可以有兩種類型:控制台程序或Windows程序。 控制台程序是在命令提示符窗口(cmd)中運行的程序。 控制台程序使用三個標准通道與用戶交互:標准輸入,標准輸出和標准錯誤[...]。
與控制台應用程序相反,Windows應用程序使用復雜的事件驅動用戶界面與用戶交互,因此不需要在此類應用程序中使用的標准通道通常會導致崩潰。
在某些情況下,Py2exe會自動解決這些問題,但至少有一個進程沒有附加的標准輸出: sys.stdout
是None
),這意味着sys.stdout.flush()
是None.flush()
,它產生你得到的錯誤。 上面鏈接的文檔有一個簡單的修復方法,可以將所有輸出重定向到文件。
import sys
sys.stdout = open(“my_stdout.log”, “w”)
sys.stderr = open(“my_stderr.log”, “w”)
只需在流程的入口點添加這些行。 還有一個關於Py2Exe和子進程之間交互的相關文檔頁面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.