很多使用 auto-py-to-exe (底层PyInstaller)打包Python脚本的开发者,都会遇到一个百思不得其解的诡异问题:
.py 源码本地双击运行一切正常,打包成单个EXE可执行文件后,一打开直接弹窗报错,提示找不到PPT/PPTX文件,报错路径指向系统Temp临时目录,和你存放程序的文件夹完全不沾边。
今天完整拆解报错根源,给出3套可直接落地的解决方案,最优方案一次修改永久复用,以后打包再也不会踩同类路径大坑。
一、报错现象直观展示
弹窗报错原文:
Failed to execute script 'PPT转化为图片' due to unhandled exception: 目录中未找到 PPT 或 PPTX 文件:
C:\Users\Administrator\AppData\Local\Temp_MEI194602
FileNotFoundError: 目录中未找到 PPT 或 PPTX 文件
程序没有读取EXE所在文件夹,反而跑到系统临时解压目录搜寻文件,最终触发文件不存在报错。
二、报错底层原理,看懂再也不踩坑
1. auto-py-to-exe开启One File单文件打包模式后,EXE运行时会自动在系统 Temp 文件夹生成 _MEIxxxx 临时文件夹;
2. EXE会把脚本、第三方依赖库全部解压到这个临时目录里启动运行;
3. 脚本中 os.getcwd() 获取的是程序运行的当前工作目录,此时目录被替换成临时文件夹;
4. 你的PPT文件放在EXE同级目录,临时目录内没有目标文件,直接抛出 FileNotFoundError 。
一句话总结:程序运行目录被篡改,找错了文件夹。
三、3套解决方案(按推荐优先级排序)
✅ 方案1:修改脚本路径逻辑【一劳永逸|强烈推荐】
区分「源码运行」和「EXE打包运行」双场景,强制程序读取EXE真实所在文件夹,修改一次,后续打包通用。
1. 在脚本最顶部插入路径判断代码
python
import sys
import os
# 自动识别运行环境,锁定程序真实根目录
if getattr(sys, 'frozen', False):
# 打包成EXE运行:获取EXE所在文件夹
BASE_DIR = os.path.dirname(sys.executable)
else:
# 直接运行py源码:获取脚本所在文件夹
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
2. 替换脚本里旧的目录读取代码
❌ 错误旧写法(会读取临时目录)
python
ppt_dir = os.getcwd()
ppt_files = [f for f in os.listdir(ppt_dir) if f.endswith(('.ppt', '.pptx'))]
✅ 正确新写法(永久读取EXE同级目录)
python
ppt_dir = BASE_DIR
ppt_files = [f for f in os.listdir(ppt_dir) if f.endswith(('.ppt', '.pptx'))]
3. 修改后重新打包,PPT和EXE放在同一个文件夹,双击即可正常运行。
⚡ 方案2:切换文件夹打包模式【不用改代码|仅测试使用】
不想改动源码,直接调整打包配置即可快速验证功能:
1. 打开auto-py-to-exe,将 One File 选项改为 False ;
2. 重新打包,会生成一个包含EXE+全部依赖的文件夹;
3. 把PPT文件放进打包生成的文件夹内,双击程序正常运行。
优缺点:无需改代码,调试方便;缺点是无法单独分发单文件,对外交付不美观。
🪝 方案3:拖拽文件启动【临时应急|单次使用】
无代码修改、无配置改动,适合临时单次转换使用:
1. 给EXE创建桌面快捷方式;
2. 鼠标按住PPT文件,直接拖拽到EXE/快捷方式上松开;
3. 程序会读取拖拽传入的文件路径,绕过目录扫描逻辑。
优缺点:应急能用,无法批量扫描文件夹内所有PPT,效率很低。
四、打包必看避坑补充要点
1. 该报错不是第三方库缺失,不用在Hidden Imports里额外填写模块,纯工作目录逻辑问题;
2. 本PPT转图片脚本调用Office PowerPoint COM组件,打包后的EXE只能在安装了微软PowerPoint的Windows电脑运行,无Office环境会出新报错;
3. 单EXE启动慢属于正常现象,程序需要解压文件到临时目录,追求启动速度优先用文件夹打包模式;
4. 进阶优化:可以给脚本增加命令行传参,手动指定PPT文件夹路径,彻底脱离固定目录限制。
五、文末总结
PyInstaller单文件打包最高发的bug就是运行目录被临时目录篡改,遇到文件找不到报错,先排查路径获取逻辑,不要盲目重装库、修改打包参数。
方案1的路径兼容代码可以做成通用模板,后续所有Python脚本打包都能直接复制复用,从根源杜绝同类踩坑。
需要这份通用的Python打包路径兼容模板代码,后台回复【打包路径】直接领取。
平时经常分享Python自动化、打包、办公脚本实战踩坑干货,关注我,少走90%的开发弯路。