运行时错误:无法打开shape_predictor_68_face_landmark.dat无法执行脚本主程序

问题描述

我一直在尝试使用pyinstaller构建可执行文件。我已经测试过main.py文件,它可以完美工作,但是当我在exe文件中尝试时,它显示错误。 另外,我从此链接https://github.com/ageitgey/face_recognition_models下载了这个shape_predictor_68_face_landmark.dat文件,并将其保存在与main.py相同的文件夹中。 我尝试了其他类似的其他堆栈问题的解决方案,但是,没有一个我有

 Traceback (most recent call last):
   File "main.py",line 12,in <module>
   File "<frozen importlib._bootstrap>",line 983,in _find_and_load
   File "<frozen importlib._bootstrap>",line 967,in _find_and_load_unlocked
   File "<frozen importlib._bootstrap>",line 677,in _load_unlocked
   File "c:\users\leena\appdata\local\programs\python\python37\lib\site-packages\PyInstaller\loader\pyimod03_importers.py",line 493,in exec_module
     exec(bytecode,module.__dict__)
   File "face_recognition\__init__.py",line 7,in <module>

   File "<frozen importlib._bootstrap>",module.__dict__)
   File "face_recognition\api.py",line 20,in <module>
 RuntimeError: Unable to open C:\Users\Leena\Desktop\hello world kivy\dist\main\face_recognition_models\models\shape_predictor_68_face_landmarks.dat
[1520] Failed to execute script main

我的main.py包含:

导入cv2

导入face_recognition

将numpy导入为np

这是我的主要规格。

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None
from kivy_deps import sdl2,glew,gstreamer
from kivymd import hooks_path as kivymd_hooks_path

a = Analysis(['main.py'],pathex=['C:\\Users\\Leena\\Desktop\\hello world kivy'],binaries=[],datas=[('C:\\Users\\Leena\\Desktop\\hello world kivy\\shape_predictor_68_face_landmarks.dat','.')],hiddenimports=[],hookspath=[kivymd_hooks_path],runtime_hooks=[],excludes=[],win_no_prefer_redirects=False,win_private_assemblies=False,cipher=block_cipher,noarchive=False)
pyz = PYZ(a.pure,a.zipped_data,cipher=block_cipher)
exe = EXE(pyz,a.scripts,[],exclude_binaries=True,name='main',debug=False,bootloader_ignore_signals=False,strip=False,upx=True,console=True )
coll = COLLECT(exe,a.binaries,a.zipfiles,a.datas,*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins + gstreamer.dep_bins)],upx_exclude=[],name='main')

提前谢谢

解决方法

最近我经历了一次非常相似的事情,我尝试使用 pyinstaller 为人脸识别项目构建一个可执行文件,但我遇到了几乎完全相同的错误。

在花了几个小时试图修复错误后,我想出了一个解决方案。据我了解,库 face_recognition (我相信您必须使用)包含其自己的形状预测模型文件(包括您传递给 data 参数的文件)。这些预测模型文件存储在 **/site-packages/face_recognition_models/models 中。现在,site-packages 目录可以在很多地方找到;您可能正在使用虚拟环境(例如在 Linux 中),在这种情况下,site-packages 将存储在 .venv/libs/python*/site-packages 中,其中 .venv 是您正在使用的虚拟环境目录。简而言之,您必须找到当前 Python 正在使用的 site-packages 目录。

出于某种原因(可能是因为它们是二进制文件),上述形状预测器模型在构建可执行文件时没有包含在 face_recognition 库中,face_recognition 需要它们来即使您自己提供了自己的形状预测模型,也能正常运行。

通过将您自己的形状预测器模型作为文件传递以便将其添加到可执行文件中,您的工作进展顺利。这里的一个问题是您使用了 datas 参数,而 shape_predictor_68_face_landmarks.dat 是一个二进制文件。为此,您可以将形状预测器模型作为参数(按照您的操作方式)传递给 binaries 参数。完成此操作后,您需要执行以下操作。

可能有比我即将提供的更好的修复,但是一旦我意识到所有这些,在 <script_name>.spec 文件中,我将以下参数添加到 binaries 参数:

# -*- mode: python ; coding: utf-8 -*-


block_cipher = None


a = Analysis(['<script_name>.py'],pathex=['<path_to_script_dir>'],# this should automatically be filled
             binaries=[('$PARENT_DIR/site-packages/face_recognition_models/models/*','face_recognition_models/models'),('<path_to_parentdir_your_shape>/shape_predictor_68_face_landmarks.dat','<path_to_parentdir_your_shape>')],datas=[...],...

您在这里要做的是手动添加那些 face_recognition 需要但在构建过程中不会自动添加的形状预测器模型。 $PARENT_DIR/site-packages/ 将是当前正在使用的 site-packages 目录的路径(这取决于您是否使用虚拟环境、操作系统等)。 path_to_parentdir_your_shape> 基本上是您存储 shape_predictor_68_face_landmarks.dat 的目录的路径(看起来您的项目目录就是您存储预测器文件的位置,因此您只需将这些值替换为上述 {{1} } 文件示例).

现在,您提供路径的方式取决于您使用的操作系统。我一直在使用Linux。在您的情况下,您必须执行我上面刚刚解释的操作,但要提供有效的 Windows 路径(使用反斜杠作为路径分隔符)。最后,在上述代码块的 *.spec 位中,这里的 * 或多或少意味着“选择此目录中的所有内容”(在我们的示例中为 .../face_recognition_models/models/* 目录)。它在 Windows 上可能不会这样工作,在这种情况下,您可以手动将多个元组传递给 models 参数,以与上述类似的方式,每个元组都包含 {{ 1}} 目录,直到您通过了所有预测模型。

此后,您应该能够从 binaries 文件构建可执行文件,并且在运行时应该不会出错。它应该按您的意愿工作。