使用pyInstaller创建exe时,我在子进程的实现上感到很挣扎。
我有一个带有gui(tkinter)的程序,其中多个按钮都有其subprocess.popen()。 ssh上有一条发送到网络设备的命令,需要一些时间才能完成。
在pyCharm中,此操作很流畅。 使用pyInstaller创建exe时,出现以下错误:
Exception in Tkinter callback
Traceback (most recent call last):
File "tkinter\__init__.py", line 1699, in __call__
File "gui.py" in line 197 in wrapper
File "subprocess.py", line 707, in __init__
File "subprocess.py", line 990, in _execute_child
FileNotFoundError: [WinError 2] The system cannot find the file specified
key not found: process1
gui.py第197行摘录的相应代码是:
proc = subprocess.Popen(['python', r'commands/pec_cmd.py',
str(cmd), pec_ip, '1', '0', '0', '0', '0'],
startupinfo=subprocess.STARTUPINFO(), env=os.environ,
stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
稍后,我将流程存储在dict中,该字典先前已通过subproccesses = {}初始化:
subprocesses['process' + str(i)] = proc
任何想法或帮助我为何收到此FileNotFoundError吗? 从PyCharm运行时可以运行,但是一旦创建了exe(尝试了--onedir和--onefile),它就会失败
答案 0 :(得分:1)
感谢@Maurice Meyer。我不怕这个事实,那就仍然需要安装python。所以我将其更改为调用exe:
现在,当直接使用exe而不是使用脚本pec_cmd.py的python调用subprocess.popen("python", commands/pec_cmd.py", ...)
时,它现在可以工作了,而不是调用subprocess.popen("pec_cmd.exe", ...)
。
答案 1 :(得分:0)
您需要确定找不到python.exe
或commands/pec_cmd.py
的文件。
您可以尝试在当前外壳程序subprocess.Popen(... shell=True)
中运行子流程,或为子流程使用完整路径
subprocess.Popen(['c:/python/python.exe', r'c:/whateverPath/commands/pec_cmd.py'])
但是您仍然依赖预先安装的Python解释器:
假设您要在另一台没有安装Python的计算机上运行您的application / exe,则子进程将失败,或者您将始终需要安装Python。