gpt4 book ai didi

python - 从 python 中的共享 fortran 库调用函数

转载 作者:太空狗 更新时间:2023-10-29 17:15:06 25 4
gpt4 key购买 nike

我想在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com