You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PyInstaller打包含MediaPipe的PyQt5应用时出现路径不存在错误

解决PyInstaller打包PyQt5+MediaPipe应用时的FileNotFoundError问题

问题根源

MediaPipe运行依赖预训练的二进制模型文件(如姿态检测的pose_landmarker_full.task),PyInstaller默认只会收集Python源码文件,不会自动打包这些非代码资源,导致程序运行时找不到模型路径,抛出FileNotFoundError。

解决方案

方法1:用--add-data参数手动添加模型文件

  1. 先找到MediaPipe的安装路径:
pip show mediapipe

复制输出中的Location字段路径,比如/home/squat/.local/lib/python3.10/site-packages。

  1. 针对不同打包模式执行命令:
  • --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文件自定义打包配置

  1. 生成初始.spec文件:
pyinstaller app.py
  1. 打开生成的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'),
    ],
    ...
)
  1. 用.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:34:58