Импорт pygrib в 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

Любой совет о том, что может быть причиной этой ошибки "неопределенный символ"?

1 ответ

Решение

Неопределенные символьные ошибки обычно вызваны одной из двух причин:

  • неправильное связывание в процессе сборки или
  • несоответствие между средой, используемой для сборки двоичного файла или библиотеки, и средой, в которой он запускается.

Неверная ссылка

Если вы собираете сам модуль pygrib, убедитесь, что необходимые библиотечные зависимости правильно связаны и расположены в правильном порядке. Основываясь на отсутствующем имени символа, __svml_round2_maskДогадываюсь pygrib.so был скомпилирован с Intel icc Компилятор C и должен быть связан с математической библиотекой, содержащей функции SVML (Short Vector Math Library). Трудно получить более конкретную информацию, не зная больше деталей о вашей среде сборки, но, например, в Linux оба icc а также gcc (которые оба называют GNU ld для связывания) нужно, чтобы эта математическая библиотека была указана в командной строке, и она должна идти после двоичного файла или библиотеки, которая ее вызывает.

Несоответствие окружающей среды

Если Pygrib не создается вами (ни явно, ни как часть pip или же conda команда установки), то вы, вероятно, несоответствие среды. Это происходит, когда pygrib.so Вы скачали, был построен против других библиотек, чем те, которые вы установили. В идеале все бинарные пакеты Python должны быть построены на очень ванильном наборе библиотек (например, контейнере manylinux1 для колес 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 пакеты? Конда-Фордж перечисляет несколько; один из них может соответствовать вашей системе.
  • Вы пробовали python-eccodes модуль вместо? Кажется, это рекомендуемый преемник пигриб.

Удачи, надеюсь, что-то здесь поможет!

Другие вопросы по тегам