gpt4 book ai didi

python - 指定对返回 double 组的 fortran 函数的 ctypes 调用(在 python 中)的返回类型

转载 作者:太空宇宙 更新时间:2023-11-03 18:54:07 25 4
gpt4 key购买 nike

我正在尝试使用 ctypes 模块从 python 程序中调用我编写的线性代数例程的(fortran)库。我已成功导入该库,并且可以调用我的子例程和返回单个值的函数。我的问题是调用返回 double 组的函数。我不知道如何指定返回类型。因此,每当我调用这样的函数时,都会出现段错误。

这是一个最小的工作示例,一个计算两个 3 向量之间的叉积的例程:

!****************************************************************************************
! Given vectors a and b, c = a x b
function cross_product(a,b)
real(dp) a(3), b(3), cross_product(3)

cross_product = (/a(2)*b(3) - a(3)*b(2), &
a(3)*b(1) - a(1)*b(3), &
a(1)*b(2) - a(2)*b(1)/)
end function cross_product

这是我的 python 脚本:

#!/usr/bin/python
from ctypes import byref, cdll, c_double
testlib = cdll.LoadLibrary('/Users/hart/codes/celib/trunk/libutils.so')
cross = testlib.vector_matrix_utilities_mp_cross_product_

a = (c_double * 3)()
b = (c_double * 3)()
a[0] = c_double(0.0)
a[1] = c_double(1.0)
a[2] = c_double(2.0)
b[0] = c_double(1.0)
b[1] = c_double(3.0)
b[2] = c_double(2.0)

print a,b
cross.restype = c_double * 3
print cross.restype
print cross(byref(a),byref(b))

这是输出:

goku:~/python/ctypes> ./test_example.py 
<__main__.c_double_Array_3 object at 0x10399b710> <__main__.c_double_Array_3 object at 0x10399b7a0>
<class '__main__.c_double_Array_3'>
Segmentation fault: 11
goku:~/python/ctypes>

我已经尝试了“cross.restype = ...”行的不同排列,但我不知道实际上应该放什么。感谢您阅读这个问题。 --格斯

最佳答案

编译器可能会返回指向数组的指针或数组描述符...因此,在混合语言时,您应该始终使用bind(C),除非包装器专门支持 Fortran。而且(毫不奇怪)bind(C) 函数无法返回数组。理论上,您可以分配该数组并返回 type(c_ptr) 给它,但如何在使用后释放它?

所以我的建议是使用子例程。

关于python - 指定对返回 double 组的 fortran 函数的 ctypes 调用(在 python 中)的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17659010/

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