PyInstaller打包Python应用执行异常:缺失shape_predictor文件
PyInstaller打包人脸识别应用时shape_predictor_68_face_landmarks.dat文件缺失问题解决办法
常见成因
- 代码硬编码的相对路径在打包后失效:开发环境的工作目录和打包后可执行文件的运行/临时解压目录不一致,导致程序找不到文件。
- PyInstaller未正确纳入数据文件:onefile模式下程序运行时会从临时解压目录读取文件,手动复制的文件不在该路径下。
- 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文件配置打包
- 生成spec文件:在终端执行
pyi-makespec your_main_script.py - 打开生成的
your_main_script.spec文件,在Analysis的datas参数中添加dat文件映射:
第一个元素是源文件路径,第二个元素是打包后文件存放的相对目录(a = Analysis( ['your_main_script.py'], datas=[('shape_predictor_68_face_landmarks.dat', '.')], # 新增该行 # 其他参数保持不变 ).表示与exe同目录,onefile模式下会自动放入临时目录)。 - 用spec文件执行打包:
pyinstaller your_main_script.spec
- 生成spec文件:在终端执行
检查打包模式与文件位置
onedir模式(默认):确保dat文件和生成的exe文件在同一目录;onefile模式:无需手动复制dat文件,通过spec配置后PyInstaller会自动将其包含在exe中,运行时自动解压到临时目录,配合代码中的路径逻辑即可读取。
权限排查
不要将可执行文件放在需要管理员权限的目录(如Windows的C:\Program Files),这类目录下程序读取文件可能因权限不足触发“文件缺失”错误,建议放在普通用户目录测试。
内容的提问来源于stack exchange,提问作者Aswathy.A
相关产品推荐
相关产品推荐

