我想从Python中的Fortran共享库调用一些函数。我在网上找到一些链接并阅读,根据我的发现,我应该做

libadd = cdll.LoadLibrary('./libbin.so')

加载共享对象。但是,这个共享对象包含来自另一个共享库的一些符号。我阅读了cdll的帮助,但是似乎不可能同时加载几个共享对象文件。如何调用此Fortran库中的函数?该库很可能是由“英特尔Fortran编译器”编译的?

最佳答案

您需要知道共享对象中函数的签名。您是否有源代码,或者一些解释函数名和参数类型的引用?
例如,我有这个源代码(mult.f90):

integer function multiply(a, b)
    integer, intent(in) :: a, b
    multiply = a * b
end function multiply

…为了演示如何一次加载和使用多个共享对象,我还提供了(add.f90):
integer function addtwo(a, b)
    integer, intent(in) :: a, b
    addtwo = a + b
end function addtwo

编译、检查符号:
% gfortran-4.4 -shared -fPIC -g -o mult.so mult.f90
% gfortran-4.4 -shared -fPIC -g -o add.so add.f90
% nm -ao mult.so | grep multiply
mult.so:00000000000005cc T multiply_

请注意,共享对象中的符号名附加了下划线。因为我有源代码,所以我知道签名是multiply_(int *a, int *b),所以很容易从ctypes调用该函数:
from ctypes import byref, cdll, c_int

mult = cdll.LoadLibrary('./mult.so')
add = cdll.LoadLibrary('./add.so')
a = c_int(2)
b = c_int(4)
print mult.multiply_(byref(a), byref(b))
print add.addtwo_(byref(a), byref(b))

输出:
8
6

关于python - 从python中的共享fortran库调用函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5811949/

10-14 17:38
查看更多