簡體   English   中英

在凍結腳本中多處理python

[英]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.stdoutNone ),這意味着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.

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