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

PyInstaller打包Python应用执行异常:缺失shape_predictor文件

PyInstaller打包人脸识别应用时shape_predictor_68_face_landmarks.dat文件缺失问题解决办法

常见成因

  1. 代码硬编码的相对路径在打包后失效:开发环境的工作目录和打包后可执行文件的运行/临时解压目录不一致,导致程序找不到文件。
  2. PyInstaller未正确纳入数据文件:onefile模式下程序运行时会从临时解压目录读取文件,手动复制的文件不在该路径下。
  3. spec文件配置错误:未在datas列表中声明需要打包的数据文件,导致PyInstaller自动打包时忽略该文件。

解决步骤

  • 修改代码中的路径获取逻辑
    打包后(尤其是onefile模式),PyInstaller会将资源解压到临时目录,可通过sys._MEIPASS获取该路径。修改读取dat文件的代码:

    import sys
    import os
    
    def get_landmark_model_path():
        # 判断是否处于打包后的运行环境
        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, 'shape_predictor_68_face_landmarks.dat')
    
    # 后续代码中使用该函数获取路径
    predictor_path = get_landmark_model_path()
    
  • 通过spec文件配置打包

    1. 生成spec文件:在终端执行
      pyi-makespec your_main_script.py
      
    2. 打开生成的your_main_script.spec文件,在Analysis的datas参数中添加dat文件映射:
      a = Analysis(
          ['your_main_script.py'],
          datas=[('shape_predictor_68_face_landmarks.dat', '.')],  # 新增该行
          # 其他参数保持不变
      )
      
      第一个元素是源文件路径,第二个元素是打包后文件存放的相对目录(.表示与exe同目录,onefile模式下会自动放入临时目录)。
    3. 用spec文件执行打包:
      pyinstaller your_main_script.spec
      
  • 检查打包模式与文件位置

    • onedir模式(默认):确保dat文件和生成的exe文件在同一目录;
    • onefile模式:无需手动复制dat文件,通过spec配置后PyInstaller会自动将其包含在exe中,运行时自动解压到临时目录,配合代码中的路径逻辑即可读取。
  • 权限排查
    不要将可执行文件放在需要管理员权限的目录(如Windows的C:\Program Files),这类目录下程序读取文件可能因权限不足触发“文件缺失”错误,建议放在普通用户目录测试。

内容的提问来源于stack exchange,提问作者Aswathy.A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 00:05:07