繁体   English   中英

ImportError:未为 f2py 加载库

[英]ImportError: Library not loaded for f2py

我正在使用f2py编译 Fortran 子例程,以便在 Python 脚本中调用。

我在 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文件的 hash 并且它们匹配。 这意味着在计算机之间使用.so存在问题。

为什么我不能在每台计算机上使用相同的预编译版本?

编辑:Mac #1 和 Mac #2 之间的注意点不同:Mac #1 安装了gfortran ,Mac #2 没有。 但是,我觉得这应该没什么区别,因为模块已经编译好了。

错误(我认为这是不言自明的): 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用户,这里有一些(理论上的)方法可以实现这一点:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM