使用PyInstaller打包含MediaPipe的PyQt5应用时出现路径不存在错误
解决PyInstaller打包PyQt5+MediaPipe应用时的FileNotFoundError问题
问题根源
MediaPipe运行依赖预训练的二进制模型文件(如姿态检测的pose_landmarker_full.task),PyInstaller默认只会收集Python源码文件,不会自动打包这些非代码资源,导致程序运行时找不到模型路径,抛出FileNotFoundError。
解决方案
方法1:用--add-data参数手动添加模型文件
- 先找到MediaPipe的安装路径:
pip show mediapipe
复制输出中的Location字段路径,比如/home/squat/.local/lib/python3.10/site-packages。
- 针对不同打包模式执行命令:
- --onedir模式:
pyinstaller --onedir \ --add-data "/home/squat/.local/lib/python3.10/site-packages/mediapipe/modules:mediapipe/modules" \ --add-data "/home/squat/.local/lib/python3.10/site-packages/mediapipe/models:mediapipe/models" \ app.py
- --onefile模式:
pyinstaller --onefile \ --add-data "/home/squat/.local/lib/python3.10/site-packages/mediapipe/modules:mediapipe/modules" \ --add-data "/home/squat/.local/lib/python3.10/site-packages/mediapipe/models:mediapipe/models" \ app.py
参数格式说明:源路径:目标路径,目标路径要保持与MediaPipe预期的相对结构一致。
方法2:通过.spec文件自定义打包配置
- 生成初始.spec文件:
pyinstaller app.py
- 打开生成的
app.spec,在datas列表中添加MediaPipe的资源路径:
a = Analysis( ['app.py'], pathex=[], binaries=[], # 添加以下datas配置 datas=[ ('/home/squat/.local/lib/python3.10/site-packages/mediapipe/modules', 'mediapipe/modules'), ('/home/squat/.local/lib/python3.10/site-packages/mediapipe/models', 'mediapipe/models'), ], ... )
- 用.spec文件重新打包:
pyinstaller app.spec
方法3:代码中动态调整模型路径(适配onefile模式)
在你的应用代码中,添加一个获取资源路径的工具函数,手动指定MediaPipe的模型路径:
import sys import os from mediapipe.python.solutions.pose import Pose def resource_path(relative_path): """获取打包后的资源路径,兼容打包/未打包状态""" try: # PyInstaller onefile模式下的临时目录 base_path = sys._MEIPASS except Exception: # 未打包时的当前工作目录 base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) # 初始化Pose时手动指定模型路径 pose_detector = Pose( static_image_mode=False, model_complexity=1, smooth_landmarks=True, min_detection_confidence=0.5, min_tracking_confidence=0.5, model_path=resource_path("mediapipe/models/pose_landmarker_full.task") )
注意:不同MediaPipe解决方案对应的模型文件名不同,比如手部检测是hand_landmarker.task,需根据你的实际使用情况调整。
额外注意事项
- 确保mediapipe 0.10.8与protobuf 3.20.3版本兼容,避免版本冲突引发其他异常。
- 建议使用虚拟环境进行打包,减少无关依赖被打包,避免路径混乱。
内容的提问来源于stack exchange,提问作者Musabbir Arrafi
相关产品推荐
相关产品推荐

