Python 进程被PyInstaller可执行文件卡在循环中

Python 进程被PyInstaller可执行文件卡在循环中,python,windows,parallel-processing,pyinstaller,python-multiprocessing,Python,Windows,Parallel Processing,Pyinstaller,Python Multiprocessing,Python v3.5,Windows 10 我正在使用多个进程并尝试捕获用户输入。搜索我看到的所有内容在对多个进程使用input()时会发生一些奇怪的事情。经过8个多小时的尝试,我所实现的一切都不起作用,我肯定我做错了,但我一辈子都想不出来 下面是一个非常精简的程序,演示了这个问题。现在,当我在PyCharm中运行这个程序时,它工作得很好,但是当我使用pyinstaller创建单个可执行文件时,它失败了。程序经常陷入循环,要求用户输入如下所示的内容: 我很确定这与Windows如何从我读到的东

Python v3.5,Windows 10

我正在使用多个进程并尝试捕获用户输入。搜索我看到的所有内容在对多个进程使用
input()
时会发生一些奇怪的事情。经过8个多小时的尝试,我所实现的一切都不起作用,我肯定我做错了,但我一辈子都想不出来

下面是一个非常精简的程序,演示了这个问题。现在,当我在PyCharm中运行这个程序时,它工作得很好,但是当我使用
pyinstaller
创建单个可执行文件时,它失败了。程序经常陷入循环,要求用户输入如下所示的内容:

我很确定这与Windows如何从我读到的东西中获取标准输入有关。我还尝试将用户输入变量作为
Queue()
项传递给函数,但问题相同。我知道你应该把
input()
放在python主进程中,所以我在
if\uuuuu name\uuuuuu='\uuuuuu main\uuuu':

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()

使用PyInstaller生成Windows可执行文件时,需要使用
多处理.freeze_support()

直截了当地说:

多处理。冻结支持()

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

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

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

在除Windows以外的任何操作系统上调用freeze_support()时没有任何效果。此外,如果该模块在Windows上由Python解释器正常运行(该程序尚未冻结),则freeze_support()无效


在您的示例中,您还需要处理不必要的代码重复。

当您使用PyInstaller生成Windows可执行文件时,需要使用
多处理.freeze\u support()

直截了当地说:

多处理。冻结支持()

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

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

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

在除Windows以外的任何操作系统上调用freeze_support()时没有任何效果。此外,如果该模块在Windows上由Python解释器正常运行(该程序尚未冻结),则freeze_support()无效


在您的示例中,您还需要处理不必要的代码重复。

什么是代码重复?我希望用户输入有两个while循环,因为如果第二个用户输入不正确,我不希望每次都在开始时重新启动。@probat
func1
func2
是相同的,您只需使用其他名称,打印的文本可以动态更改,例如为此添加另一个参数。你也可以把while循环放在一个函数中,只需调用两次就可以了。在我的真实脚本中,函数中有用于用户输入的while循环。我只是试着尽可能简单,直截了当地提出这个问题。谢谢你的帮助,我真的很感激。有很多关于多处理模块的文档,我错过了这一部分。什么是代码复制?我希望用户输入有两个while循环,因为如果第二个用户输入不正确,我不希望每次都在开始时重新启动。@probat
func1
func2
是相同的,您只需使用其他名称,打印的文本可以动态更改,例如为此添加另一个参数。你也可以把while循环放在一个函数中,只需调用两次就可以了。在我的真实脚本中,函数中有用于用户输入的while循环。我只是试着尽可能简单,直截了当地提出这个问题。谢谢你的帮助,我真的很感激。有很多关于多处理模块的文档,我错过了这一部分。
from multiprocessing import Process, freeze_support

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

if __name__ == '__main__':
    freeze_support()
    Process(target=f).start()