PyInstaller打包含PyQt5、transformers的项目为exe时提示tqdm缺失如何解决
解决方案
核心原因
transformers 库会通过 importlib.metadata 检查依赖包的版本元数据,PyInstaller 默认不会将 Python 包的版本元数据(*.dist-info 目录)打包到 exe 中,即使 tqdm 代码已经被打包,版本校验不通过仍会报错。
操作步骤
- 修改打包用的 .spec 配置文件
在文件最开头添加如下代码,用于自动获取依赖包的元数据路径:
import os from importlib.metadata import distribution def get_package_metadata(pkg_name): dist = distribution(pkg_name) dist_info_dir = f"{dist.name}-{dist.version}.dist-info" return (dist.locate_file(dist_info_dir), dist_info_dir)
- 修改 Analysis 配置段
- 补全
hiddenimports列表,添加缺失的依赖项,避免后续同类报错 - 在
datas列表中添加依赖包的元数据条目
修改后的配置示例:
a = Analysis(['App.py'], pathex=[], binaries=[], datas=[ ('./resources/images/logo.png', '.'), ('./resources/model/config.json', '.'), ('./resources/model/pytorch_model.bin', '.'), ('./resources/model/special_tokens_map.json', '.'), ('./resources/model/tokenizer.json', '.'), ('./resources/model/tokenizer_config.json', '.'), ('./resources/model/vocab.txt', '.'), # 新增依赖包元数据配置 get_package_metadata('tqdm'), get_package_metadata('transformers'), get_package_metadata('datasets'), get_package_metadata('tokenizers'), get_package_metadata('packaging') ], # 补全隐式导入依赖 hiddenimports=['tqdm', 'packaging', 'regex', 'requests', 'sacremoses', 'tokenizers', 'datasets.utils._filelock'], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False)
- 清理缓存重新打包
执行打包命令时添加--clean参数清理旧缓存,避免缓存影响:
pyinstaller --clean App.spec
备选临时方案
如果不想修改 spec 配置,可以在代码最开头、导入 transformers 之前添加环境变量跳过版本校验:
import os # 禁用transformers版本检查 os.environ['TRANSFORMERS_SKIP_VERSION_CHECK'] = '1' os.environ['TRANSFORMERS_NO_ADVISORY_WARNINGS'] = '1' from PyQt5.QtCore import QThread, QObject, pyqtSignal from transformers import AutoTokenizer, AutoModelForQuestionAnswering, pipeline
内容的提问来源于stack exchange,提问作者Rifky
相关产品推荐
相关产品推荐

