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