使用PyInstaller --onefile打包YOLOv8时default.yaml缺失如何解决
解决PyInstaller --onefile打包YOLOv8缺少default.yaml的问题
问题根源
使用--onefile打包时,PyInstaller未自动收集Ultralytics库依赖的配置文件(如default.yaml),导致程序运行时在临时目录中找不到这些必要文件。
解决方案
方法1:手动添加Ultralytics配置文件到打包命令
- 找到Python环境中
ultralytics/cfg目录的实际路径:- 执行
pip show ultralytics查看库的安装位置,比如输出的Location字段为C:\Python39\Lib\site-packages,则cfg目录路径为C:\Python39\Lib\site-packages\ultralytics\cfg。
- 执行
- 修改打包命令,将cfg目录下的文件纳入打包范围:
注意替换命令中的cfg路径为你实际的库安装路径,Windows系统下用分号分隔源路径和打包后的目标路径。pyinstaller --onefile --add-data "best.pt;." --add-data "C:\Python39\Lib\site-packages\ultralytics\cfg;ultralytics/cfg" main.py
方法2:使用PyInstaller Hook自动收集依赖文件
- 在项目根目录创建
hook-ultralytics.py文件,内容如下:from PyInstaller.utils.hooks import collect_data_files datas = collect_data_files('ultralytics') - 执行以下命令打包:
该Hook会自动扫描并收集Ultralytics所有依赖的数据文件(包括配置yaml、权重模板等),无需手动指定路径。pyinstaller --onefile --add-data "best.pt;." --additional-hooks-dir=. main.py
补充代码调整(可选)
如果方法1执行后仍存在路径识别问题,可在代码中导入YOLO前添加以下逻辑,强制Ultralytics从打包后的临时目录读取资源:
if __name__ == '__main__': base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__))) # 添加以下两行代码 import ultralytics ultralytics.__path__ = [os.path.join(base_path, 'ultralytics')] + ultralytics.__path__ anvil_model= os.path.join(base_path,'best.pt') model = YOLO(anvil_model) detect_realtime(model)
内容的提问来源于stack exchange,提问作者Mr Z
相关产品推荐
相关产品推荐

