【问题标题】:Multiprocessing python within frozen script冻结脚本中的多处理 python
【发布时间】:2019-08-14 00:27:35
【问题描述】:

我正在尝试将使用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] 系统找不到指定的文件

感谢您的帮助!

freeze_support 文档:https://docs.python.org/2/library/multiprocessing.html#multiprocessing.freeze_support

【问题讨论】:

    标签: python python-3.x windows multiprocessing cx-freeze


    【解决方案1】:

    这似乎是一个很长一段时间内的问题 - 我发现至少可以追溯到 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()
    

    【讨论】:

      【解决方案2】:

      这不是多处理库或 py2exe 本身的问题,而是您运行应用程序的方式的副作用。 py2exe documentation 包含有关此主题的一些讨论:

      在 Windows 下运行的程序可以有两种类型:控制台 程序或 Windows 程序。控制台程序是在 命令提示符窗口 (cmd)。控制台程序与用户交互 使用三个标准通道:标准输入、标准输出和 标准错误 […]。

      与控制台应用程序相反,Windows 应用程序交互 与用户一起使用复杂的事件驱动用户界面和 因此不需要在这样的使用标准频道 应用程序通常会导致崩溃。

      在某些情况下,Py2exe 会自动解决这些问题,但至少有一个进程没有附加标准输出:sys.stdout is 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 上还有一个相关的文档页面。

      【讨论】:

        猜你喜欢
        • 2021-09-30
        • 2014-08-25
        • 1970-01-01
        • 1970-01-01
        • 2019-07-01
        • 2014-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多