使用 Python 运行英特尔 Fortran 二进制文件

Posted

技术标签:

【中文标题】使用 Python 运行英特尔 Fortran 二进制文件【英文标题】:Run Intel Fortran binary with Python 【发布时间】:2016-01-13 07:50:09 【问题描述】:

我正在尝试从 Mac 上的 Python 脚本中运行 Fortran 二进制文件。在命令行中,Fortran 二进制文件可以正常工作,但是当我在 Python 中使用 os.systemsubprocess.open 运行它时,会出现以下错误:

dyld: Library not loaded: libimf.dylib
Referenced from: /Path/To/Binary
Reason: image not found

Fortran 二进制文件是使用 Intel Fortran 构建的。知道这里出了什么问题吗?

编辑:

我在 ~/.bash_profile 中设置了这些环境变量,但没有帮助:

export LD_LIBRARY_PATH="/opt/intel/compilers_and_libraries_2016.0.083/mac/compiler/lib"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/intel/compilers_and_libraries_2016.1.111/mac/compiler/lib"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/intel/compilers_and_libraries/mac/lib"
export DYLD_LIBRARY_PATH="/opt/intel/compilers_and_libraries_2016.0.083/mac/compiler/lib"
export DYLD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/intel/compilers_and_libraries_2016.1.111/mac/compiler/lib"
export DYLD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/intel/compilers_and_libraries/mac/lib"

我正在我的 Mac 上从终端运行 python 脚本。我尝试从 Python 打印

print os.environ['LD_LIBRARY_PATH']
print os.environ['DYLD_LIBRARY_PATH']

两者都给出以下错误:

KeyError: 'DYLD_LIBRARY_PATH'

编辑:

我尝试在我的 Python 代码中使用 os.system 运行另一个二进制文件,效果很好。

【问题讨论】:

可能是LD_LIBRARY_PATH问题,检查一下你的命令行和子进程中是否设置了这个。 你是直接从你的 bash shell 运行 python 吗?您应该使用详细信息而不是在 cmets btw 中编辑问题 您应该使用 os.environ 从 python 脚本中检查您的环境 以任何方式运行 fotran 二进制文件(可执行文件)与运行另一种二进制文件有什么不同吗? 【参考方案1】:

我预计问题是因为 Python 的 os.environ 字典中没有 'DYLD_LIBRARY_PATH' 键; DYLD_LIBRARY_PATH 的配置文件设置看起来不错,但 Python 没有收到它。

在我的优胜美地系统上,如果我使用英特尔提供的 compilervars.csh 脚本来设置 DYLD_LIBRARY_PATH(导致值为 /opt/intel/compilers_and_libraries_2016.1.111/mac/compiler/lib:...),那么以下操作对我来说成功

$ cat test.f90 && ifort test.f90 && python -c "import os; os.system('./a.out');"
print *, 'Hello World!'
end
 Hello World!

(在 bash 中,您可能会使用 compilervars.sh 脚本来代替。)

【讨论】:

【参考方案2】:

问题可能在于 Mac El Capitan 中内置的新系统完整性保护 (SIP)。基本上,当您运行受保护的进程时,例如 python 脚本,DYLD_LIBRARY_PATH 不会传递给脚本。

最好的解决方案是以避免使用动态库的方式重新编译您的 Fortran 二进制文件。或者,您可以通过禁用 SIP(​​可能不推荐)来防止此问题,如下所述:

Macworld Article

您可以通过搜索“DYLD_LIBRARY_PATH SIP”找到有关此问题的更多信息

【讨论】:

以上是关于使用 Python 运行英特尔 Fortran 二进制文件的主要内容,如果未能解决你的问题,请参考以下文章

通过额外的优化标志减少 fortran 运行时间

启用英特尔Fortran时“找不到psxevars命令”

使用 Notepad++ 和 Intel Fortran 编译器编译文件

具有140多个模块的英特尔Fortran 11.1长编译时间

英特尔 oneAPI 与旧版 Parallel Studio XE 的优势(Fortran 用户)

mpifort -DMPI 编译错误:派生类型“mpi_status”用作实际参数。适用于英特尔 Fortran,但不适用于 GNU Fortran