首页 > 解决方案 > ImportError:未为 f2py 加载库

问题描述

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

我已经在 Mac #1 上编译了 Fortran 源代码,运行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 未安装。但是,我觉得这应该没什么区别,因为模块已经编译好了。

标签: pythonmacosgfortranf2py

解决方案


错误(我认为这是不言自明的):,并且问题末尾的编辑已经包含一个(不需要的)答案:)Library not loaded: /usr/local/opt/gcc/lib/gcc/9/libgfortran.5.dylib ... Reason: image not found

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

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

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

推荐阅读