PyInstaller打包含Spacy的程序运行时报错找不到spacy.tokens._dict_proxies模块
解决方案
错误根因
PyInstaller无法识别Spacy中Cython编译模块的动态导入逻辑,导致遗漏了spacy.tokens._dict_proxies等子模块,直接运行脚本时Python解释器可以自动检索到对应模块,因此不会报错。
分步操作方案
方案1:命令行直接指定缺失模块打包
如果你暂时没有使用spec文件管理打包配置,直接在打包命令中追加缺失模块的隐藏导入参数即可:pyinstaller --onefile --windowed --hidden-import "spacy.tokens._dict_proxies" FleetMatch_Web_Crawler.py其中
--windowed是GUI程序专用参数,可避免运行exe时弹出黑色控制台窗口,不需要可以删除。方案2:修改spec文件补充隐藏导入
如果你已经在用spec文件配置打包,直接修改Analysis段的hiddenimports配置项,除了当前报错的模块,还可以提前补入其他高频遗漏的Spacy模块:a = Analysis( ['FleetMatch_Web_Crawler.py'], # 其余原有配置(pathex、binaries、已经添加的Spacy语言模型datas配置等)保持不变 hiddenimports=[ 'spacy.tokens._dict_proxies', 'spacy._align', 'spacy.pipeline.pipes', 'spacy.kb', 'spacy.util' ], # 其余原有配置保持不变 )修改完成后直接用
pyinstaller your_config.spec重新打包即可。方案3:添加Spacy专属Hook自动拉取全量依赖
如果多次打包仍然提示不同的Spacy模块缺失,可以创建自定义Hook让PyInstaller自动检索所有Spacy相关依赖:- 在项目根目录新建
hooks文件夹 - 在
hooks文件夹下新建hook-spacy.py文件,写入以下内容:
from PyInstaller.utils.hooks import collect_all datas, binaries, hiddenimports = collect_all('spacy')- 打包时在命令中追加hook路径参数:
pyinstaller --onefile --windowed --additional-hooks-dir ./hooks FleetMatch_Web_Crawler.py或者在spec文件的
hookspath配置项中加入./hooks路径即可。- 在项目根目录新建
注意事项
- 打包前确认当前命令行环境的Python解释器和你正常运行脚本的解释器是同一个,避免不同环境的Spacy版本差异导致依赖不匹配
- Spacy语言模型需要单独加入打包的datas配置中,且代码中加载模型时使用相对路径,不要使用本地绝对路径
- 排查问题时可以先去掉
--onefile参数打包为文件夹模式,测试运行正常后再打包为单EXE文件,可大幅减少打包测试的时间消耗
内容的提问来源于stack exchange,提问作者Manas Chhotray
相关产品推荐
相关产品推荐

