在 python 中导入 pygrib
importing pygrib in python
尽管在安装pygrib时没有遇到任何错误,但在导入pygrib时遇到了以下错误:
>>> import pygrib
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /python/python-2.7.13/lib/python2.7/site-packages/pygrib.so: undefined symbol: __svml_round2_mask
关于可能导致此 "undefined symbol" 错误的原因有什么建议吗?
未定义的符号错误通常由以下两种情况之一引起:
- 构建过程中的链接不正确,或者
- 用于构建二进制文件或库的环境与其所在环境不匹配 运行。
链接不正确
如果您正在构建 pygrib 模块本身,请确保以正确的顺序正确链接所需的库依赖项。根据缺少的符号名称 __svml_round2_mask
,我猜你的 pygrib.so
是用英特尔 icc
C 编译器编译的,需要链接到包含 SVML(短向量数学库)函数。在不了解构建环境的更多细节的情况下很难获得更具体的信息,但是例如,在 linux 上,icc
和 gcc
(都调用 GNU ld
进行链接) 需要在他们的命令行上指定数学库,并且它需要在 之后 调用它的二进制文件或库。
环境不匹配
如果 pygrib 不是由您构建的(无论是显式构建,还是作为 pip
或 conda
安装命令的一部分),那么您的环境可能不匹配。当您下载的 pygrib.so
是针对与您安装的不同的库构建的时,就会发生这种情况。理想情况下,所有 Python 二进制包都将针对一组非常普通的库(例如 linux 轮子的 "manylinux1" 容器)构建,以便它们将 运行 在大多数系统上,但有时需要使用特定的优化或针对不常见的库来构建专门的 performance-critical 包。如果这些优化或库在构建系统和安装结果包的系统之间不匹配,则可能会导致 undefined symbol
错误。
减少这种情况发生的一种方法是尽可能不 mix-and-match 包存储库。也就是说,如果您使用的是 Anaconda,则只从 Anaconda 中提取包。我知道,并不总是可能的,对吧?
如果您在 linux,有时可以使用 ldd
命令找出不匹配的地方,例如:
$ ldd -r /python/python-2.7.13/lib/python2.7/site-packages/pygrib.so
您会看到一堆以 Py
或 _Py
开头的未定义符号——忽略那些,它们由 Python 本身提供。但在其中,您将有望发现需要哪个特定库 __svml_round2_mask
。仔细查看它的完整路径,以及列出的其他库的完整路径,这可能表明不匹配的来源。
其他建议
- 在您的问题中包括更多细节,例如您的 OS 以及您如何安装
pygrib
及其依赖项,可能使我们能够提供更具体的建议。
- 如果你的问题的标题更具体,它可以吸引更多的关注。
- 您是否尝试过其他
pygrib
软件包? Conda-forge 列出几个;其中之一可能与您的系统匹配。
- 您尝试过
python-eccodes
模块吗?它似乎是 pygrib 的推荐继任者。
祝你好运,希望这里的内容对你有所帮助!
尽管在安装pygrib时没有遇到任何错误,但在导入pygrib时遇到了以下错误:
>>> import pygrib
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /python/python-2.7.13/lib/python2.7/site-packages/pygrib.so: undefined symbol: __svml_round2_mask
关于可能导致此 "undefined symbol" 错误的原因有什么建议吗?
未定义的符号错误通常由以下两种情况之一引起:
- 构建过程中的链接不正确,或者
- 用于构建二进制文件或库的环境与其所在环境不匹配 运行。
链接不正确
如果您正在构建 pygrib 模块本身,请确保以正确的顺序正确链接所需的库依赖项。根据缺少的符号名称 __svml_round2_mask
,我猜你的 pygrib.so
是用英特尔 icc
C 编译器编译的,需要链接到包含 SVML(短向量数学库)函数。在不了解构建环境的更多细节的情况下很难获得更具体的信息,但是例如,在 linux 上,icc
和 gcc
(都调用 GNU ld
进行链接) 需要在他们的命令行上指定数学库,并且它需要在 之后 调用它的二进制文件或库。
环境不匹配
如果 pygrib 不是由您构建的(无论是显式构建,还是作为 pip
或 conda
安装命令的一部分),那么您的环境可能不匹配。当您下载的 pygrib.so
是针对与您安装的不同的库构建的时,就会发生这种情况。理想情况下,所有 Python 二进制包都将针对一组非常普通的库(例如 linux 轮子的 "manylinux1" 容器)构建,以便它们将 运行 在大多数系统上,但有时需要使用特定的优化或针对不常见的库来构建专门的 performance-critical 包。如果这些优化或库在构建系统和安装结果包的系统之间不匹配,则可能会导致 undefined symbol
错误。
减少这种情况发生的一种方法是尽可能不 mix-and-match 包存储库。也就是说,如果您使用的是 Anaconda,则只从 Anaconda 中提取包。我知道,并不总是可能的,对吧?
如果您在 linux,有时可以使用 ldd
命令找出不匹配的地方,例如:
$ ldd -r /python/python-2.7.13/lib/python2.7/site-packages/pygrib.so
您会看到一堆以 Py
或 _Py
开头的未定义符号——忽略那些,它们由 Python 本身提供。但在其中,您将有望发现需要哪个特定库 __svml_round2_mask
。仔细查看它的完整路径,以及列出的其他库的完整路径,这可能表明不匹配的来源。
其他建议
- 在您的问题中包括更多细节,例如您的 OS 以及您如何安装
pygrib
及其依赖项,可能使我们能够提供更具体的建议。 - 如果你的问题的标题更具体,它可以吸引更多的关注。
- 您是否尝试过其他
pygrib
软件包? Conda-forge 列出几个;其中之一可能与您的系统匹配。 - 您尝试过
python-eccodes
模块吗?它似乎是 pygrib 的推荐继任者。
祝你好运,希望这里的内容对你有所帮助!