Python脚本经auto-py-to-exe打包为exe后运行结果与原脚本不一致如何解决
问题根因
PyInstaller --onefile 单文件模式运行时,会先将全部程序依赖解压到系统临时目录的随机文件夹再执行代码,此时代码中的__file__变量指向的是临时目录下的编译后文件路径,而非exe文件实际存放的目录,因此你读取到的文件列表是临时目录的内容,和原脚本运行时读取脚本所在目录的逻辑完全不一致。
修复方案
方法1:修改代码适配多运行环境(推荐)
替换路径获取逻辑,新增打包运行环境的判断,同时补充路径拼接、跳过自身的兼容逻辑,修改后代码如下:
import os import sys # 兼容两种运行场景获取目标目录 if getattr(sys, 'frozen', False): # exe运行场景:取exe文件所在的目录 current_dir = os.path.dirname(sys.executable) else: # 本地py脚本运行场景:取当前脚本所在的目录 current_dir = os.path.dirname(os.path.abspath(__file__)) files = os.listdir(current_dir) for file in files: # 跳过exe自身,避免误操作 if file == os.path.basename(sys.executable): continue split_tup = os.path.splitext(file) if split_tup[1] == '': # 拼接完整路径避免工作目录变动导致重命名失败 old_path = os.path.join(current_dir, file) new_path = os.path.join(current_dir, f"{file}.jpg") os.rename(old_path, new_path) # 阻止控制台自动关闭 a = input()
方法2:调整打包模式(可选)
如果不想修改代码,也可以去掉打包命令中的--onefile参数,用目录模式打包,此时路径逻辑和脚本运行时差异更小,但兼容性不如修改代码的方案,也不方便单文件分发。
打包命令调整说明
如果采用修改代码的方案,原有打包命令不需要任何改动,重新打包即可:pyinstaller --noconfirm --onefile --console "C:/mypath/jpg_wizard.py"
内容的提问来源于stack exchange,提问作者Johnny Sasquatch
相关产品推荐
相关产品推荐

