ImportError:未为f2py

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

我已经在运行#Mojave 10.14的Mac#1上编译了Fortran源代码。我使用以下代码进行编译:

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没有。但是,我认为这应该没什么不同,因为模块已经编译。

sd529 回答:ImportError:未为f2py

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

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

因此, libgfortran.dylib 必须存在于导入模块的任何计算机上(在指定位置)。由于我不是 OSX 用户,因此有一些(理论上的)方法可以做到这一点:

  • 安装包含它的软件包。 [GNU.GCC]: gfortran installer for Mac OS X和其他 URL 提到了有关安装 GCC 的内容。但这似乎是一个很大的开销,我想知道是否也没有包含它的轻量级软件包,然后将其安装在目标计算机上
  • 自己分发文件(请注意,这也适用于它依赖的任何其他“特殊” .dylib )。安装模块时手动复制它。这是一种解决方法,从许可的角度不知道这是多么可行,再加上您还需要 sudo
  • 针对静态 libgfortran 版本构建模块。同样,我不知道是否存在这样的问题(或者您是否必须手动构建它,我认为这会产生大量的麻烦-我构建了 GCC (没有 Fortran ,我认为)是在 OSX 上完成的,这花了我几天时间(以及很多研究工作)
,

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

import sys
sys.path.append(r"dir_parh/to/your/.so/file")
import lib_name
本文链接:https://www.f2er.com/3127381.html

大家都在问