在CentOS上集成Fortran与Python主要有两种方法:使用f2py
工具和使用ctypes
库。以下是详细的步骤和示例。
f2py
是NumPy团队开发的一个工具,可以将Fortran程序转换为Python模块,从而在Python中调用Fortran程序。以下是具体步骤:
编写Fortran代码:
创建一个.f90
扩展名的Fortran源文件,例如hello.f90
:
subroutine hello(a)
implicit none
integer, intent(in) :: a
print *, 'Hello from Fortran90!!!', a
end subroutine hello
编译Fortran代码:
在终端中运行以下命令来编译Fortran代码:
f2py -m foo -c foo.f90
这将生成一个名为foo.cpython-<version>-linux-gnu.so
的文件。
在Python中调用Fortran函数:
在Python控制台中运行以下代码:
import foo
foo.hello(15)
输出将是:
Hello from Fortran90!!! 15
ctypes
是Python内置的一个库,可以用来调用外部C动态链接库,因此也可以用于调用Fortran程序。以下是具体步骤:
编写Fortran代码:
创建一个Fortran源文件,例如circle.f90
:
subroutine area_of_circle(r, area)
use iso_c_binding
implicit none
real(c_double), intent(in) :: r
real(c_double), intent(out) :: area
area = 4 * atan(1.0) * r**2
end subroutine area_of_circle
编译Fortran代码为动态链接库:
在终端中运行以下命令:
gfortran -shared -fPIC circle.f90 -o circle.so
在Python中调用Fortran函数:
编写Python调用脚本test_mat.py
:
import numpy as np
from numpy.ctypeslib import load_library, ndpointer
from ctypes import c_int
# 加载动态链接库
flib = load_library("circle", "./circle.so")
# 指定参数和返回数据类型
flib.area_of_circle.argtypes = [ndpointer(dtype=np.float64, ndim=1), c_int]
flib.area_of_circle.restype = c_double
# 创建一个二维数组
data = np.empty(shape=(4, 5), dtype=np.float64, order='F')
# 将数组首地址传入Fortran中进行计算
flib.area_of_circle(data.ctypes.data, 4)
# 打印结果
print("Area of circle with radius 2.0 is", data[0, 0])
运行Python脚本:
在终端中运行以下命令:
python test_mat.py
输出将是:
Area of circle with radius 2.0 is 31.41592653589793
通过以上步骤,你可以在CentOS上成功地将Fortran代码集成到Python中。选择哪种方法取决于你的具体需求和偏好。