ImportError: библиотека не загружена для f2py - PullRequest
2 голосов
/ 11 ноября 2019

Я использую f2py для компиляции подпрограммы на Фортране для вызова в скрипте Python.

Я скомпилировал исходный код Fortran на Mac # 1, запустив Mojave 10.14. Я скомпилировал его, используя:

f2py -c -m <ModuleName> <SourceName.f90>

Это работает. Я получаю .so файл, который я могу импортировать в Python, используя:

import <ModuleName> as m

Проблема возникает, когда я пытаюсь запустить его на другом Mac.

На Mac # 2, также работающем с Mojave 10.14, когда я пытаюсь использовать предварительно скомпилированный модуль:

>>> import <ModuleName> as m
Traceback (most recent call last):
  File "Stats_Wizard.py", line 20, in <module>
    import <ModuleName> as sf
ImportError: dlopen(/path/to/<ModuleName>.so, 2): Library not loaded: /usr/local/opt/gcc/lib/gcc/9/libgfortran.5.dylib
  Referenced from: /path/to/<ModuleName>.so
  Reason: image not found

Я проверил хэш файлов .so на каждом компьютере иони совпали. Это означает, что есть проблема с использованием .so между компьютерами.

Есть ли причина, по которой я не смог бы использовать одну и ту же предварительно скомпилированную версию на каждом компьютере?

РЕДАКТИРОВАТЬ: Примечание, которое отличается в Mac # 1 и Mac # 2: Mac # 1 имеет gfortran установлен, Mac # 2 нет. Однако я чувствую, что это не должно иметь значения, потому что модуль уже скомпилирован.

Ответы [ 2 ]

2 голосов
/ 11 ноября 2019

Ошибка (которую я считаю очевидной): Library not loaded: /usr/local/opt/gcc/lib/gcc/9/libgfortran.5.dylib ... <strong>Reason: image not found</strong>, и редактирование в конце вашего вопроса уже включает (нежелательный) ответ:)

Ваш модуль ( ModuleName. поэтому ) содержит только ваш код и использует «материал» из libgfortran.dylib , который содержит ядро ​​ Fortran (или, если хотите, бэкэнд).
Когда ваш модуль был собран, он был связан с libgfortran.dylib , и, как следствие, ему это нужно во время выполнения (когда он загружен). Чтобы проверить это, попробуйте otool -L ModuleName.so.

Итак, libgfortran.dylib должен присутствовать на любом компьютере (в указанном месте), куда импортируется ваш модуль. Так как я не OSX пользователь, вот несколько (теоретических) подходов, чтобы это произошло:

  • Установите пакет, содержащий его. [GNU.GCC]: установщик gfortran для Mac OS X и другие URL упоминают кое-что об установке GCC . Но это кажется слишком большой накладной нагрузкой. Интересно, не существует ли какого-либо облегченного пакета, в котором он тоже есть, и установите его на целевые машины
  • Распространите файл самостоятельно (обратите внимание, что это также относится к любымдругие «специальные» .dylib s, от которых это зависит). Скопируйте его вручную при установке модуля. Это обходной путь, не знаю, насколько это возможно с точки зрения лицензирования, плюс вам также нужно sudo
  • Сборка вашего модуля на основе статического libgfortran версия. Опять же, я не знаю, есть ли такая вещь (или вам придется создавать ее вручную, что, как я полагаю, вызовет огромное количество головных болей - я построил GCC (без * 1045)* Fortran , я думаю) на OSX , и мне потребовалось несколько дней (и много исследований), чтобы сделать это)
0 голосов
/ 11 ноября 2019

Пожалуйста, проверьте, добавили ли вы каталог вашего встроенного файла в путь к Python. Для проверки, действительно ли это так, попробуйте:

import sys
sys.path.append(r"dir_parh/to/your/.so/file")
import lib_name
...