PyInstaller打包缺失numpy依赖DLL的问题及相关疑问
PyInstaller打包含Cython生成pyd文件的Python脚本问题解答
问题背景
使用Cython和PyInstaller打包包含pyd文件的Python脚本appX.py,已修改appX.spec添加numpy作为隐式导入,但运行PyInstaller时出现以下错误:
FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\user\Documents\prgm\appX\dist\appX\_internal\numpy.libs\libopenblas64__v0.3.23-293-gc2f4bdbb-gcc_10_3_0-2bde3a66a51006b2b53eb373ff767a3f.dll'
已下载对应DLL,但Windows拒绝将其复制到打包目录的numpy.libs文件夹中,针对以下疑问解答:
1. 当前PyInstaller的打包进度处于什么状态?
打包流程卡在依赖文件复制阶段,未完成全部打包。PyInstaller已经在处理numpy的依赖文件,尝试将对应的openblas DLL复制到dist目录的指定位置时失败,导致整个打包流程中断,最终的可执行文件或完整分发目录并未生成。
2. 是否仅缺失该DLL文件,其余打包步骤已完成?若如此,能否手动添加后分发dist目录?
不是,打包中断后dist目录是不完整的——比如可执行文件可能未生成、其他依赖资源可能未全部复制到位,仅手动添加这个DLL无法让打包产物正常运行,也不能直接分发该目录。
3. 若未完成全部步骤,是否需重新运行PyInstaller?如何解决DLL缺失问题?手动添加会被PyInstaller移除吗?
需要重新运行PyInstaller,解决DLL缺失问题的可行方法:
- 检查本地numpy依赖:先确认你的Python环境中numpy安装目录下的
numpy.libs文件夹里是否存在这个DLL。如果本地就没有,说明numpy安装不完整,执行pip install --force-reinstall numpy重新安装numpy,确保所有依赖DLL齐全。 - 手动在spec文件中指定DLL路径:如果本地有这个DLL但PyInstaller没收集到,修改
appX.spec的datas参数,添加该DLL的复制规则,示例:
这样PyInstaller会主动将该DLL复制到指定目录。datas = [ # 替换为你本地该DLL的实际路径 ("C:/PythonXX/Lib/site-packages/numpy/numpy.libs/libopenblas64__v0.3.23-293-gc2f4bdbb-gcc_10_3_0-2bde3a66a51006b2b53eb373ff767a3f.dll", "_internal/numpy.libs") ] - 打包完成后手动添加的DLL不会被PyInstaller移除,但前提是打包流程正常完成——当前打包失败,手动添加无意义,必须让PyInstaller在打包过程中正确处理该文件。
4. 如何避免长路径问题,将该DLL文件移动到numpy.libs文件夹?
解决Windows长路径限制的方法:
- 启用Windows长路径支持:按下
Win+R输入gpedit.msc打开组策略编辑器,依次进入计算机配置→管理模板→系统→文件系统,找到并启用「启用长路径」选项,重启电脑后即可支持更长的文件路径。 - 缩短项目路径:将整个项目目录移动到路径更短的位置,比如
C:\appX,这样dist目录下的文件路径长度会大幅缩短,避免触发Windows的路径长度限制。
内容的提问来源于stack exchange,提问作者Farn Wang
相关产品推荐
相关产品推荐

