如何减少PyInstaller生成的分发包中重复的BLAS DLL数量
嘿,这个问题我太熟悉了!PyInstaller处理依赖的时候偶尔会犯“重复复制”的毛病,尤其是像BLAS这种被多个科学计算包依赖的DLL。别慌,给你几个实用的解决办法:
手动清理重复副本(最快应急方案):既然你已经用WinMerge确认这几个DLL是完全一致的,那最简单的办法就是打包完成后,直接进入
_internal目录,删掉多余的三个副本,只留一个就行。记得删完一定要跑一遍程序测试,确保不会因为缺文件报错——毕竟小心驶得万年船嘛。修改.spec文件从根源控制复制:如果不想每次打包后手动删,那咱们从PyInstaller的配置入手。首先用
pyinstaller --name your_app your_script.py生成对应的.spec文件,然后打开它,在Analysis部分的binaries参数里手动指定这个BLAS DLL的路径,明确告诉PyInstaller只复制一次。比如:a = Analysis( ['your_script.py'], pathex=[], binaries=[('C:/path/to/your/openblas.dll', '.')], # 替换成你实际的DLL路径 datas=[], hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], noarchive=False, )这样PyInstaller会优先使用你指定的这个副本,不会再因为多个模块依赖而重复复制了。另外,你也可以在
excludes里排除掉可能导致重复检测的冗余路径,进一步避免重复。检查虚拟环境的依赖冗余:有时候问题出在你的虚拟环境里——比如同时装了numpy、scipy的多个版本,或者不同渠道(conda/pip)安装的包都依赖BLAS,导致PyInstaller在依赖分析时多次捕捉到同一个DLL。你可以用
pip list命令看看环境里的包,卸载掉多余的科学计算类库版本,只保留一个稳定的,这样PyInstaller的依赖分析就只会找到一次这个DLL啦。调整OpenBLAS的安装方式:如果你是用conda装的OpenBLAS,有时候conda的包结构会让PyInstaller误判依赖路径。可以试试改用pip安装OpenBLAS相关的包(比如
pip install numpy openblas),或者在打包前设置一下环境变量,让PyInstaller能准确识别到唯一的BLAS DLL路径,避免重复复制。
内容来源于stack exchange

