进程陷入 PyInstaller 可执行文件循环

pro*_*bat 4 python windows parallel-processing pyinstaller python-multiprocessing

Python v3.5、Windows 10

我正在使用多个进程并尝试捕获用户输入。input()搜索我看到的所有内容,在使用多个进程时会发生奇怪的事情。经过 8 个小时以上的尝试,我实施的任何措施都不起作用,我确信我做错了,但我一生都无法弄清楚。

以下是演示该问题的非常精简的程序。现在,当我在 PyCharm 中运行该程序时,它可以正常工作,但是当我用来pyinstaller创建单个可执行文件时,它会失败。该程序不断陷入循环,要求用户输入如下所示的内容:在此输入图像描述

我非常确定这与 Windows 如何从我读过的内容中获取标准输入有关。我还尝试将用户输入变量作为Queue()项目传递给函数,但存在同样的问题。我读到你应该放入input()主要的 python 进程,所以我在下面这样做了if __name__ = '__main__':

from multiprocessing import Process
import time


def func_1(duration_1):
    while duration_1 >= 0:
        time.sleep(1)
        print('Duration_1: %d %s' % (duration_1, 's'))
        duration_1 -= 1


def func_2(duration_2):
    while duration_2 >= 0:
        time.sleep(1)
        print('Duration_2: %d %s' % (duration_2, 's'))
        duration_2 -= 1


if __name__ == '__main__':

    # func_1 user input
    while True:
        duration_1 = input('Enter a positive integer.')
        if duration_1.isdigit():
            duration_1 = int(duration_1)
            break
        else:
            print('**Only positive integers accepted**')
            continue

    # func_2 user input
    while True:
        duration_2 = input('Enter a positive integer.')
        if duration_2.isdigit():
            duration_2 = int(duration_2)
            break
        else:
            print('**Only positive integers accepted**')
            continue

    p1 = Process(target=func_1, args=(duration_1,))
    p2 = Process(target=func_2, args=(duration_2,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
Run Code Online (Sandbox Code Playgroud)

Dar*_*aut 5

multiprocessing.freeze_support() 当您使用 PyInstaller 生成 Windows 可执行文件时需要使用。

直接来自文档

multiprocessing.freeze_support()

添加对使用多处理的程序被冻结以生成 Windows 可执行文件的支持。(已使用 py2exe、PyInstaller 和 cx_Freeze 进行测试。)

需要在主模块的if name == ' main ' 行之后直接调用此函数。例如:

from multiprocessing import Process, freeze_support

def f():
    print('hello world!')

if __name__ == '__main__':
    freeze_support()
    Process(target=f).start()
Run Code Online (Sandbox Code Playgroud)

如果省略 freeze_support() 行,则尝试运行冻结的可执行文件将引发 RuntimeError。

在 Windows 以外的任何操作系统上调用 freeze_support() 都不会产生任何影响。另外,如果模块在 Windows 上由 Python 解释器正常运行(程序没有被冻结),则 freeze_support() 不起作用。

在您的示例中,您还应该解决不必要的代码重复。