我正在尝试将使用 multiprocessing
的脚本编译成 Windows 可执行文件。起初我遇到了与 Why python executable opens new window instance when function by multiprocessing module is called on windows 相同的问题当我将它编译成可执行文件时。按照接受的答案,我调整了我的脚本,这样
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 multiprocessing does not work with py2exe 的解决方案建议添加
multiprocessing.set_executable(os.path.join(sys.exec_prefix, 'pythonw.exe'))
你的脚本,但是这会导致脚本形式(甚至还没有编译)的错误:
FileNotFoundError: [WinError 2] The system cannot find the file specified
感谢您的帮助!
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()
关于python - 卡住脚本中的多处理 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55309421/