PyInstaller打包Python项目后运行exe报FileNotFoundError求助
PyInstaller打包Ultralytics项目时FileNotFoundError的解决方法
用PyInstaller打包Python项目生成exe后,运行报错:
Failed to execute script 'main' due to unhandled exception: [Errno 2] No such file or directory: 'C:\\Users\\p-IN-CHE7-ptsintern\\AppData\\Local\\Temp\\_MEI96922\\ultralytics\\cfg\\default.yaml'已尝试更新ultralytics包,但问题依旧。
问题原因
PyInstaller默认不会自动打包Ultralytics依赖的配置文件(如default.yaml),exe运行时会解压到临时目录,缺少这些文件就会触发FileNotFoundError。
解决方法
方法1:用--add-data参数手动添加文件
- 先获取ultralytics包的安装路径,执行命令:
pip show ultralytics
从输出的Location字段得到路径,比如C:\Users\XXX\AppData\Local\Programs\Python\Python310\Lib\site-packages
- 执行打包命令,添加需要的配置文件:
# Windows系统 pyinstaller --add-data "C:\Users\XXX\AppData\Local\Programs\Python\Python310\Lib\site-packages\ultralytics\cfg/*;ultralytics/cfg" --add-data "C:\Users\XXX\AppData\Local\Programs\Python\Python310\Lib\site-packages\ultralytics\assets/*;ultralytics/assets" main.py # Linux/macOS系统 pyinstaller --add-data "/usr/local/lib/python3.10/site-packages/ultralytics/cfg/*:ultralytics/cfg" --add-data "/usr/local/lib/python3.10/site-packages/ultralytics/assets/*:ultralytics/assets" main.py
- 注意Windows用
;分隔源路径和目标路径,Linux/macOS用:
方法2:通过.spec文件配置
- 生成初始.spec文件:
pyinstaller main.py
- 打开
main.spec,修改datas列表,添加Ultralytics的文件路径:
a = Analysis( ['main.py'], pathex=[], binaries=[], # 替换成你的ultralytics实际路径 datas=[ ('C:\\Users\\XXX\\AppData\\Local\\Programs\\Python\\Python310\\Lib\\site-packages\\ultralytics\\cfg', 'ultralytics/cfg'), ('C:\\Users\\XXX\\AppData\\Local\\Programs\\Python\\Python310\\Lib\\site-packages\\ultralytics\\assets', 'ultralytics/assets'), ], # ... 保留文件中其他原有内容 )
- 用.spec文件重新打包:
pyinstaller main.spec
方法3:代码中指定配置文件路径(备选)
如果前两种方法无效,可以在代码中适配打包后的路径:
import os import sys def get_ultralytics_config_path(filename): if getattr(sys, 'frozen', False): # 打包后运行环境,获取临时解压目录 base_dir = sys._MEIPASS else: # 开发环境,获取当前文件所在目录 base_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接配置文件路径 return os.path.join(base_dir, 'ultralytics', 'cfg', filename) # 使用示例:加载default.yaml config_path = get_ultralytics_config_path('default.yaml') # 后续用config_path读取配置文件
内容的提问来源于stack exchange,提问作者Ahill Savio
相关产品推荐
相关产品推荐

