ImportError: Library not loaded for f2py

ImportError: Library not loaded for f2py

我正在使用 f2py 编译要在 Python 脚本中调用的 Fortran 子例程。

我在 Mac #1,运行ning Mojave 10.14 上编译了 Fortran 源代码。我编译它使用:

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

这行得通。我得到一个 .so 文件,我可以使用以下方法将其导入 Python:

import <ModuleName> as m

当我尝试在另一个 Mac 上 运行 时出现问题。

在 Mac #2,还有 运行ning 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 没有。但是,我觉得这应该没什么区别,因为模块已经编译过了。

请检查您是否已将构建文件的目录添加到您的 python 路径中。要检查是否确实如此,请尝试:

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

错误(我相信这是不言自明的):库未加载:/usr/local/opt/gcc/lib/gcc/9/libgfortran。5.dylib ... <strong>原因:找不到图像</strong>,问题末尾的编辑已经包含一个(不需要的)答案:)

您的模块 (ModuleName.so) 仅包含您的代码并且正在使用来自 libgfortran.dylib[=43 的 "stuff" =] 其中包含 Fortran 核心(或后端,如果你愿意的话)。
构建您的模块时,它链接到 libgfortran.dylib,因此,它需要在运行时(加载时)。要对此进行测试,请尝试 otool -L ModuleName.so.

因此,libgfortran.dylib 需要出现在导入模块的任何机器上(在指定位置)。由于我不是 OSX 用户,这里有一些(理论上的)方法可以实现这一点:

  • 安装包含它的包。 [GNU.GCC]: gfortran installer for Mac OS X 和其他 URL 提到了一些关于安装 GCC 的事情。但这似乎是一个太大的开销,我想知道是否有一些轻量级的包也包含它,并在目标机器上安装它
  • 自己分发文件(请注意,这也适用于它所依赖的任何其他 "special" .dylib)。安装模块时手动复制它。这是一个解决方法,不知道从许可的角度来看这有多可行,另外你还需要 sudo
  • 针对 static libgfortran 版本构建模块。再一次,我不知道是否有这样的事情(或者你是否必须手动构建它,我认为这会产生大量的头痛 - 我构建了 GCC (我认为没有 Fortran,在 OSX 上,我花了几天时间(和大量研究)才得到完成了)