使用ctypes突变整数数组

时间:2009-08-25 00:44:02

标签: python ctypes

目前我正在将我的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

1 个答案:

答案 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 ...>
>>>