使用PyInstaller打包facenet_pytorch脚本时遇文件找不到错误求助
问题:PyInstaller打包含facenet_pytorch的Python脚本时丢失权重文件
我的Python脚本依赖以下模块:
import base64 from flask import Flask, request, jsonify import os import numpy as np from PIL import Image from facenet_pytorch import MTCNN, InceptionResnetV1 from multiprocessing import Pool import time import torch
使用PyInstaller打包后,运行可执行文件时出现错误:
FileNotFoundError: [Errno 2] No such file or directory: '/var/folders/4_/xp6410q54xn78hfvvbd7v5lw0000gn/T/_MEIVyuj8j/facenet_pytorch/models/../data/pnet.pt'
环境为Python 3.10虚拟环境,已尝试以下操作但未解决问题:
- 添加隐藏导入的打包命令:
pyinstaller --onefile --hidden-import="numpy" --hidden-import="torch" --hidden-import="facenet_pytorch" face_api.py
执行后出现动态库相关警告:
8959 WARNING: Cannot find path ./libtorch.dylib (needed by /Users/abhinandansharma/Desktop/face_api/env/lib/python3.10/site-packages/torchvision/_C.so) 8959 WARNING: Cannot find path ./libtorch_python.dylib (needed by /Users/abhinandansharma/Desktop/face_api/env/lib/python3.10/site-packages/torchvision/_C.so) 8959 WARNING: Cannot find path ./libtorch_cpu.dylib (needed by /Users/abhinandansharma/Desktop/face_api/env/lib/python3.10/site-packages/torchvision/_C.so) 8959 WARNING: Cannot find path ./libc10.dylib (needed by /Users/abhinandansharma/Desktop/face_api/env/lib/python3.10/site-packages/torchvision/_C.so)
- 指定site-packages路径打包,警告消失但错误依旧:
pyinstaller --paths "env/lib/python3.10/site-packages" --hidden-import="torch" --hidden-import="facenet_pytorch" --hidden-import="numpy" face_api.py
错误信息更新为:
Traceback (most recent call last): File "face_api.py", line 21, in <module> File "facenet_pytorch/models/mtcnn.py", line 214, in __init__ File "facenet_pytorch/models/mtcnn.py", line 34, in __init__ File "torch/serialization.py", line 771, in load File "torch/serialization.py", line 270, in _open_file_like File "torch/serialization.py", line 251, in __init__ FileNotFoundError: [Errno 2] No such file or directory: '/Users/abhinandansharma/Desktop/face_api/dist/face_api/facenet_pytorch/models/../data/pnet.pt' [37511] Failed to execute script 'face_api' due to unhandled exception!
解决方案
1. 手动处理facenet_pytorch权重文件
PyInstaller不会自动识别facenet_pytorch的权重文件(pnet.pt、rnet.pt、onet.pt等),需要手动配置打包规则并修改脚本路径:
步骤1:修改脚本中的模型初始化代码
添加路径适配函数,让脚本在打包前后都能正确找到权重文件:
import sys import os import torch from facenet_pytorch import MTCNN, InceptionResnetV1 def get_resource_path(relative_path): # 适配PyInstaller打包后的临时目录 if hasattr(sys, '_MEIPASS'): return os.path.join(sys._MEIPASS, relative_path) # 开发环境下的路径 return os.path.join(os.path.abspath("."), relative_path) # 手动指定权重路径初始化MTCNN mtcnn = MTCNN( image_size=160, margin=0, min_face_size=20, thresholds=[0.6, 0.7, 0.7], factor=0.709, post_process=True, device='cuda' if torch.cuda.is_available() else 'cpu', pnet_weights=get_resource_path('facenet_pytorch/data/pnet.pt'), rnet_weights=get_resource_path('facenet_pytorch/data/rnet.pt'), onet_weights=get_resource_path('facenet_pytorch/data/onet.pt') ) # InceptionResnetV1初始化(若出现权重问题可同理手动指定) resnet = InceptionResnetV1( pretrained='vggface2', device='cuda' if torch.cuda.is_available() else 'cpu', classify=False )
步骤2:生成并编辑PyInstaller spec文件
先生成基础spec文件:
pyinstaller --name face_api face_api.py
打开生成的face_api.spec文件,修改datas和hiddenimports配置,将权重文件目录加入打包:
import sys import os # 根据虚拟环境路径调整site-packages位置 site_packages_path = os.path.join(sys.executable, '../lib/python3.10/site-packages') a = Analysis( ['face_api.py'], pathex=[], binaries=[], # 添加facenet_pytorch的data目录到打包资源 datas=[ (os.path.join(site_packages_path, 'facenet_pytorch/data'), 'facenet_pytorch/data') ], hiddenimports=['numpy', 'torch', 'facenet_pytorch', 'torchvision'], ... )
步骤3:通过spec文件打包
pyinstaller face_api.spec
2. 解决torch动态库警告
在spec文件的binaries中添加torch相关动态库:
a = Analysis( ... binaries=[ (os.path.join(site_packages_path, 'torch/lib/libtorch.dylib'), '.'), (os.path.join(site_packages_path, 'torch/lib/libtorch_python.dylib'), '.'), (os.path.join(site_packages_path, 'torch/lib/libtorch_cpu.dylib'), '.'), (os.path.join(site_packages_path, 'torch/lib/libc10.dylib'), '.') ], ... )
3. 验证打包结果
进入dist目录运行生成的可执行文件,确认权重文件加载正常,无FileNotFoundError。
内容的提问来源于stack exchange,提问作者Abhinandan Sharma
相关产品推荐
相关产品推荐

