cx_Freeze打包Python程序运行报numpy _multiarray_umath DLL加载失败错误
cx_Freeze打包numpy相关程序跨设备运行失败解决方案
错误原因
该报错是cx_Freeze打包时遗漏了numpy运行必需的依赖DLL导致:开发环境本地预装了对应版本VC++运行时、numpy关联C扩展DLL,所以程序运行正常;无相关依赖的设备运行时无法加载必需文件,触发_multiarray_umath导入失败。
解决步骤
- 确认架构一致性
当前打包使用的是32位Python3.8,生成的是32位程序,需确保目标设备支持32位程序运行(64位Windows默认兼容32位程序,32位设备不能运行64位程序)。 - 修改cx_Freeze打包配置,强制包含numpy依赖
修改setup.py打包脚本,显式指定打包numpy的全部核心文件,示例配置如下:
import sys import os from cx_Freeze import setup, Executable import numpy # 收集numpy核心目录的所有文件 numpy_core_path = os.path.dirname(numpy.core.__file__) build_options = { "packages": ["numpy"], "include_files": [(numpy_core_path, "numpy/core")], # 可额外添加搜索到的VC++运行时DLL路径 } base = "Console" if sys.platform == "win32" else None setup( name="PLC-Log", version="1.0", description="PLC日志工具", options={"build_exe": build_options}, executables=[Executable("main.py", base=base)] )
- 补充VC运行时依赖
numpy 1.21.1依赖32位版本的VC 2015-2019运行时,可选择两种方式处理:- 打包时将本地32位Python目录下的
msvcp140.dll、vcruntime140.dll、vcruntime140_1.dll加入include_files列表一同打包 - 直接在目标设备上安装对应32位版本的VC++ Redistributable运行时安装包
- 打包时将本地32位Python目录下的
- 版本降级验证
如果以上操作仍未解决问题,可将numpy版本降级至1.19.5,该版本依赖更简单,打包兼容性更好,执行pip install numpy==1.19.5后重新打包测试即可。 - 打包后预验证
打包完成后,将生成的exe目录复制到本地无Python环境的路径下运行测试,确认无报错后再发送到目标设备运行。
内容的提问来源于stack exchange,提问作者jett chen
相关产品推荐
相关产品推荐

