我想用ctypes模塊從python程序中調用一個(fortran)線性庫我寫的代數例程。我已成功導入庫,並可以調用我的子程序以及返回單個值的函數。我的問題是調用返回一個雙精度數組的函數。我無法弄清楚如何指定返回類型。因此,每當我調用這樣的函數時,我都會遇到段錯誤。指定一個ctypes調用返回類型(在python中)返回一個fortran函數,返回一個雙精度數組
這裏有一個最低的工作例如,常規取兩個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 = ...」,但我無法弄清楚w帽子應該真的去那裏。感謝您閱讀這個問題。 --Gus
是否有你沒有使用[f2py](http://cens.ioc.ee/projects/f2py2e/usersguide/)的原因? – SethMMorton
@SethMMorton因爲它無法處理派生數據類型。我的代碼非常「現代」,有很多「對象」,不僅僅是數字和數組。對於派生數據類型來說,這個包在大多數情況下似乎都有效。 https://github.com/jameskermode/f90wrap – glwhart