python - 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 未安装。但是,我觉得这应该没什么区别,因为模块已经编译好了。
解决方案
错误(我认为这是不言自明的):,并且问题末尾的编辑已经包含一个(不需要的)答案:)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 ) ,我花了几天时间(和大量研究)来完成它)
推荐阅读
- python - 使用 OAuth 的 Python Twitter API 不提供电子邮件
- git - 如何在 git 上确认并一一添加所有更改
- umbraco - Umbraco 扩展标签
- typescript - 为具有条件类型的可选参数声明依赖参数类型
- optaplanner - 如何在 Optaplanner 中实现自定义终止
- html - BEM 是否会强制您创建不必要的元素?
- mongodb - 如何查找 Mongoose Array 元素的 schemaType
- mysql - SparkSQL 连接问题
- python - 如何向 Django ModelForm 添加额外的字段?
- python - 有序字典的深拷贝是否有望保留其顺序?