Fortran端
- 接口定义:使用
ISO_C_BINDING
模块来定义与C兼容的接口。例如,定义一个函数:
use ISO_C_BINDING
implicit none
! 定义一个简单的函数
integer(c_int) function add_numbers(a, b) bind(c, name='add_numbers')
integer(c_int), value :: a
integer(c_int), value :: b
add_numbers = a + b
end function add_numbers
- 编译生成动态链接库:使用
gfortran
编译生成动态链接库(.so
文件)。例如:
gfortran -shared -o mylib.so -fPIC mycode.f90
- 数据类型转换:确保Fortran函数使用与C兼容的数据类型,如
c_int
、c_double
等。
Python端
- 加载动态链接库:使用
ctypes
库加载动态链接库。例如:
import ctypes
# 加载动态链接库
mylib = ctypes.CDLL('./mylib.so')
- 定义函数接口:定义函数的参数类型和返回值类型。例如:
mylib.add_numbers.argtypes = [ctypes.c_int, ctypes.c_int]
mylib.add_numbers.restype = ctypes.c_int
- 调用函数:调用Fortran函数。例如:
result = mylib.add_numbers(2, 3)
print(result)
- 数据类型转换:将Python数据类型转换为
ctypes
中的C兼容数据类型。
可能遇到的问题及解决方案
- 数据类型不匹配:确保Fortran和Python端的数据类型一致。检查
ctypes
中的数据类型与ISO_C_BINDING
中定义的类型是否对应。
- 找不到动态链接库:确保动态链接库路径正确。可以将动态链接库放在Python脚本相同目录,或者设置
LD_LIBRARY_PATH
环境变量。
- 函数名冲突:在Fortran端使用
bind(c, name='...')
指定唯一的函数名,避免与其他库函数名冲突。
- 调用约定不一致:使用
bind(c)
确保Fortran函数使用C调用约定,与ctypes
兼容。