带有Subprocess.popen的Pyinstaller作为exe失败

时间:2018-07-25 10:01:51

标签: python tkinter subprocess pyinstaller

使用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),它就会失败

2 个答案:

答案 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.execommands/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。