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 上,我花了几天时间(和大量研究)才得到完成了)
我正在使用 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 上,我花了几天时间(和大量研究)才得到完成了)