2011-08-22 115 views
0

我有一個問題,格式化我的輸入和輸出參數在python中使用ctypes訪問dll中的fortran函數。我可以訪問庫和函數,但是在如何格式化參數方面掙扎。ctypes的輸入和輸出參數

的F90代碼開始爲:

subroutine DataSub (Data_input,da,db,dy) 

    double precision, intent(in) :: Data_input(9) 
    double precision, intent(out) :: da,db,dy 

你是如何定義的輸入和輸出參數的這種情況下,ctypes的?

回答

2

事情是這樣的:

from ctypes import *#just for brevity in this example 
input = (c_double*9)() 
input[0] = ..... 
da = c_double() 
db = c_double() 
dy = c_double() 
dll.DataSub(byref(input), byref(da), byref(db), byref(dy)) 
+0

如果其中一個輸出是一個數組,它會是相似的嗎?如果da(在FORTRAN中)長度爲2,python中的調用是「da =(c_double * 2)()」? – Chris

+0

是的克里斯是正確的。閱讀ctypes教程,它非常好。 –

+0

是的,謝謝。我一直在閱讀它,但它在這樣的一些領域中是模糊的或混亂的。感謝您的答覆! – Chris

2

很可能這些會是c_double,但是不應該再使用「雙精度」。 改爲使用實型,而不是使用Fortran中的ISO_C_Binding來提供類似C的界面。 ISO_C_Binding還允許您通過值而不是通過引用傳遞參數。 沒有它,你將需要使用http://docs.python.org/library/ctypes.html#passing-pointers-or-passing-parameters-by-reference

爲ISO_C_BINDING有些樣品由約翰·裏德提供:http://www.fortran.bcs.org/2002/interop.htm

+0

ctypes的可以參考就好過,確實需要這樣做的輸出參數 –

+0

其實,我認爲沒有ISO_C_Binding所有參數必須是byref,無論他們的意圖。如果不使用綁定,您還需要知道編譯器附加到符號的「_」。因此,在我看來,在Fortran方面引入一些接口定義是一個好主意。更緊密地模仿C語言行爲應該可以實現更好的可移植性和Python方面的更少奇觀。 – haraldkl