使用Subprocess调用Python脚本转exe后无输出问题求助
解决建议
1. 修正子进程命令并读取输出
你代码里的命令python run trial.py大概率是笔误——应该是直接调用trial.py,即python trial.py。另外,你用subprocess.Popen创建进程后没有读取输出,所以即使trial.py有内容输出,exe也不会显示。修改代码如下:
import subprocess import sys from subprocess import PIPE, STDOUT # 修正命令:直接运行trial.py command = 'python trial.py' # 加上text=True让输出按文本处理 proc = subprocess.Popen(command, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, text=True) # 实时读取并打印子进程的输出 for line in proc.stdout: print(line, end='') # 等待子进程结束,获取返回码 return_code = proc.wait() print(f"\n子进程返回码: {return_code}")
2. 解决路径定位问题
exe运行时的默认工作目录可能不是它所在的文件夹,导致找不到trial.py。需要先获取exe的绝对路径,再准确定位trial.py:
import subprocess import sys import os from subprocess import PIPE, STDOUT # 获取当前程序所在目录(兼容py脚本和exe两种情况) if getattr(sys, 'frozen', False): # 打包成exe后的情况 app_dir = os.path.dirname(sys.executable) else: # 直接运行py脚本的情况 app_dir = os.path.dirname(os.path.abspath(__file__)) # 构造trial.py的绝对路径,避免路径问题 trial_full_path = os.path.join(app_dir, 'trial.py') # 用引号包裹路径,防止路径含空格时出错 command = f'python "{trial_full_path}"' proc = subprocess.Popen(command, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, text=True) for line in proc.stdout: print(line, end='') proc.wait()
3. 确保Python解释器可被调用
如果目标机器没有把Python添加到系统PATH中,直接用python可能找不到解释器。可以尝试以下两种方案:
- 让用户将Python安装目录下的
python.exe路径添加到系统PATH; - 在命令中指定Python的绝对路径,比如
C:/Python39/python.exe(根据实际安装路径调整)。
4. 调试排查
如果还是没有输出,可添加调试代码确认路径是否正确:
import os import sys print("当前工作目录:", os.getcwd()) if getattr(sys, 'frozen', False): print("EXE所在目录:", os.path.dirname(sys.executable)) else: print("脚本所在目录:", os.path.dirname(os.path.abspath(__file__))) # 检查trial.py是否存在 app_dir = os.path.dirname(sys.executable) if getattr(sys, 'frozen', False) else os.path.dirname(os.path.abspath(__file__)) trial_path = os.path.join(app_dir, 'trial.py') print("trial.py路径:", trial_path) print("文件是否存在:", os.path.exists(trial_path))
打包exe后运行,根据这些调试信息确认路径和文件是否正常。
内容的提问来源于stack exchange,提问作者mayliew
相关产品推荐
相关产品推荐

