`eccodes` library not found

2.4k Views Asked by At

I have installed the eccodes library using Conda, but when I try to import it in Python I get "Cannot find the ecCodes library".

Why do I get this error and how can I resolve it? I think that Python does not know where to find the library.

I used the commands found here. That is,

conda install -c conda-forge eccodes
pip3 install --upgrade eccodes

I am using a Windows machine.

2

There are 2 best solutions below

3
On

I wouldn't mess with Pip here. Conda Forge provides both the compiled library (eccodes) and the Python bindings (python-eccodes). The latter lists the former as a dependency, so it should be sufficient to use:

conda install -c conda-forge python-eccodes
1
On

After asking a colleague we found a solution by running the code

import ecmwflibs

Now eccodes is recognised

He found this because the error message was raised by the script in ~/Anaconda3/Lib/site-packages/gribapi/bindings.py

#
# (C) Copyright 2017- ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
#
# In applying this licence, ECMWF does not waive the privileges and immunities
# granted to it by virtue of its status as an intergovernmental organisation nor
# does it submit to any jurisdiction.
#

# Authors:
#   Alessandro Amici - B-Open - https://bopen.eu
#   Shahram Najm - ECMWF - https://www.ecmwf.int
#

from __future__ import absolute_import, division, print_function, unicode_literals

import logging
import pkgutil

import cffi

__version__ = "1.4.2"

LOG = logging.getLogger(__name__)

try:
    import ecmwflibs as findlibs
except ImportError:
    import findlibs

library_path = findlibs.find("eccodes")
if library_path is None:
    raise RuntimeError("Cannot find the ecCodes library")

# default encoding for ecCodes strings
ENC = "ascii"

ffi = cffi.FFI()
CDEF = pkgutil.get_data(__name__, "grib_api.h")
CDEF += pkgutil.get_data(__name__, "eccodes.h")
ffi.cdef(CDEF.decode("utf-8").replace("\r", "\n"))


lib = ffi.dlopen(library_path)