Python 进程被PyInstaller可执行文件卡在循环中
Python v3.5,Windows 10 我正在使用多个进程并尝试捕获用户输入。搜索我看到的所有内容在对多个进程使用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如何从我读到的东
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()无效
在您的示例中,您还需要处理不必要的代码重复。什么是代码重复?我希望用户输入有两个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()