PyInstaller打包后subprocess无法找到已添加的file.exe求助
问题分析与解决方法
核心原因
你猜的完全正确——当使用--onefile模式打包时,PyInstaller会把所有依赖文件(包括你的file.exe)打包进单个exe,运行时自动解压到系统临时目录(比如Windows的%temp%\_MEIxxxxxx随机命名目录),而不是你运行生成exe的当前工作目录。你的脚本里用.\file.exe是在当前工作目录查找文件,自然找不到。
修复代码
修改你的Python脚本,获取PyInstaller运行时的临时解压路径,拼接出file.exe的正确位置:
import subprocess import os import sys # 获取PyInstaller onefile模式下的临时解压目录 def get_resource_path(relative_path): try: # 运行打包后的exe时,sys._MEIPASS指向临时解压目录 base_path = sys._MEIPASS except Exception: # 直接运行py脚本时,用当前脚本所在目录 base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) # 拼接file.exe的正确路径 proc = get_resource_path("file.exe") CLI_VERSION = subprocess.check_output([proc, '-v'], shell=True).decode('utf-8').strip() print(CLI_VERSION)
打包命令调整
使用--add-binary参数(针对二进制文件更规范),命令如下:
pyinstaller.exe --onefile --add-binary ".\file.exe;." .\myfile.py
;是Windows下的路径分隔符,Linux/macOS环境替换为:即可。
查看exe包内文件的方法
- 用7-Zip直接打开:onefile模式生成的exe本质是自解压归档,右键选择7-Zip→打开压缩包,就能查看内部所有文件。
- pyinstxtractor:你已经在用的工具,解压后会把所有打包文件提取到对应目录,方便验证文件是否被正确添加。
- PyInstaller调试模式:打包时添加
--debug all参数,运行生成的exe会输出详细日志,包括临时目录路径和文件解压情况。
内容的提问来源于stack exchange,提问作者user206904
相关产品推荐
相关产品推荐

