如何在PyInstaller SPEC文件中正确配置PyTables二进制文件收集?
问题描述
更新PyInstaller至最新版本后,打包包含PyTables的Python脚本失败,报错:
RuntimeError: Blosc2 library not found. I looked for "libblosc2.dll, C:\Users\USER\AppData\Local\Temp_MEI10642\tables\libblosc2.dll, None"
根据相关GitHub帖子提示,需要添加tables的二进制文件。已有SPEC文件,尝试两种配置均未解决:
- Case1:设置
binaries=[('C:\\Python39\\bin\\libblosc2.dll', 'BINARY')],仍报相同错误 - Case2:设置
binaries=[('C:\\Python39\\bin\\libblosc2.dll', '.')],导致加载器循环无法启动
需要知道如何在SPEC文件中正确实现--collect-binaries=tables的效果。
系统信息:PyInstaller 6.3.0,Python 3.9.7,Windows 10 19044 SP0,tables 3.9.2
解决方案
方法1:使用PyInstaller内置函数自动收集二进制文件
直接在SPEC文件中调用PyInstaller提供的collect_binaries函数,可自动收集tables依赖的所有二进制文件,完全等价于命令行--collect-binaries=tables的效果。修改后的SPEC文件示例:
from PyInstaller.utils.hooks import collect_binaries a = Analysis( ['你的脚本文件名.py'], pathex=[], binaries=collect_binaries('tables'), # 替换原有的binaries配置 datas=[], hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], noarchive=False, ) pyz = PYZ(a.pure) exe = EXE( pyz, a.scripts, a.binaries, a.datas, [], name='你的程序名称', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=True, disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, )
方法2:手动指定正确的输出路径
若不想使用自动收集,需将libblosc2.dll放到PyTables预期的路径——即tables子目录下(对应报错中的临时目录路径)。修改SPEC的binaries配置:
binaries=[('C:\\Python39\\bin\\libblosc2.dll', 'tables')]
打包后,libblosc2.dll会被放置到程序临时目录的tables子文件夹中,与PyTables的查找路径匹配,可解决库未找到的问题。
之前配置失败的原因
- Case1中的
'BINARY'是自定义目录,PyTables不会在此路径下查找依赖库,因此报错依旧 - Case2中的
.会将dll放到程序根目录,可能与其他依赖冲突,引发加载循环
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

