PyInstaller打包Python代码后cfgrib未出现在xarray引擎列表求助
解决PyInstaller打包cfgrib代码时的引擎识别问题
以下是几个可行的解决方向:
手动注册cfgrib引擎
打包后的可执行文件中,xarray可能无法自动发现cfgrib后端,在代码开头主动注册引擎:import xarray as xr from cfgrib.xarray_plugin import CfgribDataStore xr.backends.register_backend('cfgrib', CfgribDataStore)或者在调用
xr.open_dataset时显式指定引擎参数:ds = xr.open_dataset('your_grib_file.grib', engine='cfgrib')手动添加eccodes和cfgrib的依赖文件
PyInstaller可能遗漏了eccodes的二进制文件、配置定义文件,需要在spec文件中手动指定:- 找到你的conda环境中eccodes的安装路径,比如环境路径下的
Library/bin(Windows)或lib(Linux/macOS),以及share/eccodes目录 - 编辑PyInstaller生成的spec文件,在
datas列表中添加这些路径:datas=[ ('/path/to/conda/env/Library/bin/eccodes*.dll', 'eccodes/bin'), # Windows示例 ('/path/to/conda/env/share/eccodes/definitions/**', 'eccodes/share/eccodes/definitions'), ('/path/to/conda/env/lib/pythonX.X/site-packages/cfgrib/*', 'cfgrib'), ] - 用
pyinstaller your_script.spec重新打包
- 找到你的conda环境中eccodes的安装路径,比如环境路径下的
设置eccodes的环境变量
打包后exe运行时可能找不到eccodes的配置文件,在代码开头添加环境变量设置:import os import sys # 获取打包后的运行目录 app_dir = sys._MEIPASS if hasattr(sys, '_MEIPASS') else os.path.dirname(os.path.abspath(__file__)) os.environ['ECCODES_DEFINITION_PATH'] = os.path.join(app_dir, 'eccodes', 'share', 'eccodes', 'definitions') os.environ['ECCODES_SAMPLES_PATH'] = os.path.join(app_dir, 'eccodes', 'share', 'eccodes', 'samples')使用--collect-all参数强制收集依赖
打包时直接用--collect-all参数让PyInstaller收集cfgrib和eccodes的所有相关文件:pyinstaller --hidden-import=cfgrib --hidden-import=eccodes --collect-all=cfgrib --collect-all=eccodes your_script.py
内容的提问来源于stack exchange,提问作者Mehdi Firouznia
相关产品推荐
相关产品推荐

