冻结脚本中的多处理 python
Multiprocessing python within frozen script
我正在尝试使用 multiprocessing
将脚本编译成 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 行)中的错误,还是我误解了我链接的答案,或者其他什么?
我还会注意到该脚本在编译时确实可以正常工作,但是您必须在生成的每个多进程(相当多)的错误消息上单击 "OK",并且每个错误消息都准确无误相同。这是否意味着我用 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()
这不是多处理库或 py2exe 本身的问题,而是 运行 应用程序方式的副作用。 py2exe documentation 包含关于此主题的一些讨论:
A program running under Windows can be of two types: a console
program or a windows program. A console program is one that runs in
the command prompt window (cmd). Console programs interact with users
using three standard channels: standard input, standard output and
standard error […].
As opposed to a console application, a windows application interacts
with the user using a complex event-driven user interface and
therefore has no need for the standard channels whose use in such
applications usually results in a crash.
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”)
只需在流程的入口点添加这些行。 interactions between Py2Exe and subprocesses 上还有一个相关的文档页面。
我正在尝试使用 multiprocessing
将脚本编译成 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 行)中的错误,还是我误解了我链接的答案,或者其他什么?
我还会注意到该脚本在编译时确实可以正常工作,但是您必须在生成的每个多进程(相当多)的错误消息上单击 "OK",并且每个错误消息都准确无误相同。这是否意味着我用 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()
这不是多处理库或 py2exe 本身的问题,而是 运行 应用程序方式的副作用。 py2exe documentation 包含关于此主题的一些讨论:
A program running under Windows can be of two types: a console program or a windows program. A console program is one that runs in the command prompt window (cmd). Console programs interact with users using three standard channels: standard input, standard output and standard error […].
As opposed to a console application, a windows application interacts with the user using a complex event-driven user interface and therefore has no need for the standard channels whose use in such applications usually results in a crash.
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”)
只需在流程的入口点添加这些行。 interactions between Py2Exe and subprocesses 上还有一个相关的文档页面。