目前我正在将我的python代码中的性能瓶颈转移到c,以调查性能影响。此代码将运行模拟,并通过ctypes将结果报告给python。但是,我在让我的类型正确匹配方面遇到了问题。
虽然我正在寻求解决这个特殊问题,但我也在寻找有关使用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];
}
}
}
python中的以下代码:
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 )
但是,此代码段会因以下追溯而死亡:
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
答案 0 :(得分:4)
看起来你想要the cast function:
可以使用强制转换函数将ctypes实例强制转换为指向不同ctypes数据类型的指针。 cast接受两个参数,一个是或者可以转换为某种指针的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 ...>
>>>