在python中导入pygrib

时间:2017-09-11 05:23:33

标签: python python-2.7 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

有关可能导致此“未定义符号”错误的建议吗?

1 个答案:

答案 0 :(得分:0)

未定义的符号错误通常由以下两种情况之一引起:

  • 构建过程中的链接不正确,或
  • 用于构建二进制文件或库的环境与运行它的环境不匹配。

链接不正确

如果您正在构建pygrib模块本身,请确保正确链接所需的库依赖项,并且顺序正确。根据缺少的符号名__svml_round2_mask,我猜你的pygrib.so是用英特尔icc C编译器编译的,需要链接到包含SVML的数学库(短矢量数学库)功能。在不了解构建环境的更多细节的情况下很难更具体,但是在Linux上,iccgcc(两者都称为GNU ld进行链接)需要在命令行上指定数学库,并且需要在之后调用它的二进制文件库。

环境不匹配

如果您没有构建pygrib(显式,或作为pipconda安装命令的一部分),那么您可能会出现环境不匹配的情况。当您下载的pygrib.so针对与您安装的库不同的库构建时,会发生这种情况。理想情况下,所有Python二进制包都是针对一组非常普通的库(例如&#34; manylinux1&#34;用于linux轮子的容器)构建的,因此它们可以在大多数系统上运行,但有时需要专门的和性能关键的包使用特殊优化或针对不常见的库构建。如果这些优化或库在构建系统与安装结果包的系统之间不匹配,则可能导致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套餐? Conda-forge列出了几个;其中一个可能与您的系统相匹配。
  • 您是否尝试过python-eccodes模块?它似乎是pygrib的推荐继任者。
祝你好运,我希望这里有所帮助!