使用PyInstaller打包含sentence_transformers脚本遇导入错误求助
RuntimeError: Failed to import transformers.models.clip.processing_clip because of the following error (look up to see its traceback):
[Errno 2] No such file or directory: 'C:\Users\xxx\AppData\Local\Temp\_MEI135322\transformers\init.py'
你的PyInstaller命令未针对transformers模块配置打包规则,这是导致错误的核心原因,以下是具体解决思路:
解决思路
1. 补充transformers相关打包参数
在现有命令基础上添加以下参数,确保PyInstaller识别并打包transformers的核心文件、数据及子模块:
--hidden-import=transformers \ --collect-data transformers \ --copy-metadata transformers \ --hidden-import=transformers.models.clip \ --hidden-import=transformers.models.clip.processing_clip
2. 自定义hook文件自动收集依赖
如果手动添加参数仍有遗漏,在当前目录创建hook-transformers.py文件(对应你命令中的--additional-hooks-dir=.),内容如下:
from PyInstaller.utils.hooks import collect_data_files, collect_submodules # 收集transformers的所有数据文件 datas = collect_data_files('transformers') # 收集transformers的所有子模块 hiddenimports = collect_submodules('transformers')
PyInstaller会自动读取该hook,完整打包transformers的所有依赖内容。
3. 处理预训练模型的打包
若脚本依赖sentence_transformers的预训练模型,需确保模型文件被正确打包:
- 提前将模型下载到本地目录(比如
./local_model) - 修改脚本中模型加载路径为本地路径:
from sentence_transformers import SentenceTransformer model = SentenceTransformer('./local_model') - 在PyInstaller命令中添加模型文件的打包参数(Windows环境):
--add-data "./local_model;./local_model"
4. 调试打包内容
暂时去掉--onefile参数,生成文件夹形式的打包结果:
pyinstaller [你的其他参数] my_script.py
进入dist/my_script目录,检查是否存在transformers文件夹及其中的__init__.py文件,若缺失则针对性补充对应的--hidden-import或--collect-data参数。
内容的提问来源于stack exchange,提问作者Expired_rice

