如何从FORTRAN访问用Python编写的函数?
有没有办法在FORTRAN中使用Python函数?我有一个Python脚本,里面有一些函数,我需要在FORTRAN代码中调用这个函数。
我看到过'f2py',它可以让FORTRAN的子程序被Python访问,还有py2exe可以把Python脚本编译成可执行文件。有没有类似'py2f'的东西?能不能把Python脚本编译成一个目标文件?这样我就可以把它和FORTRAN代码链接起来。
举个例子,假设'mypython_func.py'是一个包含函数的Python脚本,而'mainfortran.f'是主程序的FORTRAN代码,它会调用这个Python函数。我想要这样做:从'mypython_func.py'编译成'mypython_func.o',从'mainfortran.f'编译成'mainfortran.o'(用命令>> gfortran -c mainfortran.f),然后链接这些文件(用命令>> gfortran -c mainfortran.o mypython_func.o -o myexec.exe)。这样的事情有可能吗?
谢谢你的时间和帮助。
Vince
2 个回答
@S.Lott的解决方案是个不错的选择。不过来回答你的问题——是的,可以从Fortran调用Python。我是先用Cython的C API把Python暴露出来,然后再用iso_c_binding
模块为那些C函数创建Fortran接口,最后从Fortran中调用它们。这种方法比较复杂,在大多数实际问题中不太值得(可以用管道的方法),但确实是可行的(我试过,成功了)。
别浪费时间去编译和翻译,直接这样做。
Fortran的第一部分程序会写一个文件,让Python去处理。输出结果到标准输出。我们叫这个程序F1。
Python读取这个文件,进行计算,然后把结果写入一个文件,供Fortran使用。我们叫这个程序P。
Fortran的第二部分程序会从标准输入读取文件,这些是Python计算的结果。
把它们连接起来
F1 | python p.py | F2
你不需要重新编译任何东西。还要注意,这三个程序是同时运行的,这样可以大大提高速度。
Python中间的部分应该是这样的。
import sys
import my_python_module
for line in sys.stdin:
x, y, p, q = map( float, line.split() )
print ("%8.3f"*6) % ( x, y, z, p, q, my_python_module.some_function( x, y, p, q ) )
这是一个简单的包装器,用于读取标准输入并以Fortran友好的格式写入标准输出。