如何将ecCodes二进制库添加到PyInstaller或py2exe打包程序中?
解决PyInstaller/py2exe打包后找不到ecCodes库的问题
问题根源是打包工具未自动收集ecCodes的二进制依赖库(如eccodes.dll),需要手动指定包含这些文件。
PyInstaller 解决方案
- 找到conda环境中的ecCodes库文件
激活你的conda环境后,通过conda info --envs获取环境路径,进入该路径下的Library\bin目录,找到eccodes.dll、eccodes_f90.dll等相关动态库文件。 - 修改
main.spec文件
在Analysis部分的datas参数中添加这些dll文件的路径配置,示例:
这里用通配符a = Analysis( ['your_script.py'], pathex=[], binaries=[], datas=[('C:/path/to/your/conda/env/Library/bin/eccodes*.dll', '.')], # 其他参数保持不变 )eccodes*.dll一次性匹配所有相关库文件,第二个参数.表示将文件复制到打包后的根目录。 - 在代码中添加环境变量适配
在脚本开头加入以下代码,确保打包后的exe能优先加载目录内的dll:import os import sys if hasattr(sys, '_MEIPASS'): # 打包后的临时运行目录 os.environ['PATH'] = sys._MEIPASS + ';' + os.environ['PATH'] - 重新打包
执行pyinstaller main.spec完成打包。
py2exe 解决方案
- 定位ecCodes库文件
同PyInstaller步骤,找到conda环境Library\bin下的eccodes.dll等相关文件。 - 修改
setup.py文件
在setup函数中添加data_files参数,将dll文件纳入打包范围,示例:from distutils.core import setup import py2exe import os # 指定需要打包的ecCodes库文件 eccodes_deps = [ ('.', ['C:/path/to/your/conda/env/Library/bin/eccodes.dll']), ('.', ['C:/path/to/your/conda/env/Library/bin/eccodes_f90.dll']), # 若有其他依赖的dll(如libpng16.dll、zlib1.dll)也需一并添加 ] setup( console=['your_script.py'], data_files=eccodes_deps, options={ 'py2exe': { 'bundle_files': 3, # 不合并为单文件,便于调试;如需单文件可设为1 'compressed': True } } ) - 代码中添加环境变量适配
同样在脚本开头加入PyInstaller步骤中的环境变量配置代码。 - 重新打包
执行python setup.py py2exe完成打包。
通用注意事项
- 打包全程需激活对应的conda环境,确保工具使用的是环境内的Python和依赖。
- 测试时将GRIB2文件放在exe同一目录,或修改代码中的文件路径为相对路径,避免绝对路径导致的文件找不到问题。
- 若仍报错,可检查是否遗漏了ecCodes依赖的其他第三方dll(如zlib、libpng等),一并添加到打包配置中。
内容的提问来源于stack exchange,提问作者Jipzy
相关产品推荐
相关产品推荐

