我一直在尝试使用 pyinstaller 构建可执行文件。我已经测试了 main.py 文件,它工作完美,但是当我在 exe 文件中尝试时,它显示错误。 我还从这个链接下载了这个 shape_predictor_68_face_landmark.dat 文件并保存在与我的 main.py 相同的文件夹中https://github.com/ageitgey/face_recognition_models 我已经尝试过其他类似堆栈问题的解决方案,但是,它们都不适合我
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>", 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\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
导入人脸识别
将 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)],
strip=False,
upx=True,
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 的目录的路径(看起来您的项目目录是存储预测器文件的位置,因此您只需将这些值替换为上述 *.spec
文件示例) .
现在,如何提供路径取决于您使用的操作系统。我一直在使用Linux。在您的情况下,您必须执行我上面解释的操作,但提供有效的 Windows 路径(使用反斜杠作为路径分隔符)。最后,在上面代码块的
.../face_recognition_models/models/*
位中,这里的 * 或多或少意味着“选择此目录中的所有内容”(我们示例中的 models
目录)。它在 Windows 上可能无法正常工作,在这种情况下,您可以按照与上面类似的方式手动将多个元组传递给 binaries
参数,每个元组都包含 models
目录中特定预测模型的路径,直到通过了所有预测模型。
此后,您应该能够从
*.spec
文件构建可执行文件,并且在运行时不会出现错误。它应该按您的预期工作。
只需在 .spec 文件中手动添加它们,例如:
datas=[
('myenv\\Lib\\site-packages\\face_recognition_models\\models\\dlib_face_recognition_resnet_model_v1.dat', 'face_recognition_models/models'),
('myenv\\Lib\\site-packages\\face_recognition_models\\models\\mmod_human_face_detector.dat', 'face_recognition_models/models'),
('myenv\\Lib\\site-packages\\face_recognition_models\\models\\shape_predictor_5_face_landmarks.dat', 'face_recognition_models/models'),
('myenv\\Lib\\site-packages\\face_recognition_models\\models\\shape_predictor_68_face_landmarks.dat', 'face_recognition_models/models')
],