2009-08-25 69 views
4

目前我正在將我的python代碼中的性能瓶頸轉移到c,以調查性能影響。該代碼將運行一個模擬,並通過ctypes將結果報告給python。但是,我有問題讓我的類型正確匹配。使用ctypes轉換整型數組

雖然我正在尋求解決這個問題,但我也在尋找更多關於使用ctypes的一般建議,因爲文檔和過程似乎有點薄。

我有下面的C函數:

extern "C" { 
    void f(int* array, int arraylen) { 
     for(int i = 0; i < arraylen; i++) { 
      array[i] = g() // mutate the value array[i]; 
     } 
    } 
} 

而在蟒蛇下面的代碼:

Traceback (most recent call last): 
    File "particle.py", line 9, in <module> 
    _f(buffer, seqlen) 
ctypes.ArgumentError: argument 1: <type 'exceptions.TypeError'>: expected LP_c_int instance instead of _ctypes.ArrayType 

回答

4

外貌:

import ctypes 

plib = ctypes.cdll.LoadLibrary('./mylib.so') 
_f = plib.f 
_f.restype = None 
_f.argtypes = [ ctypes.POINTER(ctypes.c_int), ctypes.c_int ] 
seqlen = 50 
buffer = ctypes.c_int * seqlen 
_f(buffer, seqlen) 

然而,這段代碼有以下回溯死亡像你想the cast function

該轉換函數可用於將ctypes實例轉換爲指向不同ctypes數據類型的指針。轉換需要兩個參數,一個是或可以轉換爲某種類型的指針的ctypes對象,以及一個ctypes指針類型。它返回第二個參數,它引用相同的內存塊作爲第一個參數的一個實例:

>>> a = (c_byte * 4)() 
>>> a 
<__main__.c_byte_Array_4 object at 0xb7da2df4> 
>>> cast(a, POINTER(c_int)) 
<ctypes.LP_c_long object at ...> 
>>> 
+0

感謝馬克,你的片段,就足以讓我找出了什麼問題,我省略了來自我的數組實例的括號,它引發了類型不匹配。 – 2009-08-25 01:04:42