python如何传数组给C的函数

python如何传数组给C的函数

c的代码:
int lkadd2( int *as, int num )
{
        int i = 0;
        int sum = 0;

        for( i=0; i<num; i++ )
        {
                sum += as;
        }

        return sum;

}

int lkadd( int a1, int a2 )
{
        return a1 + a2;
}

已经编译为so文件了。

在python中调用如下:


from ctypes import *
dll = CDLL("liblkadd.so")

i=100
j=45
print "test add",i,"+",j,"=",dll.lkadd(i,j)


#c=(1,2,3,4,5,6)
#print "test arry:",dll.lkadd2(byref(c),6)
#or
#c=[1,2,3,4,5,6]
#print "test arry:",dll.lkadd2(byref(c),6)

可以执行正确:
test add 100 + 45 = 145

但是执行调用lkadd2则会报错:
报错byref() argument must be a ctypes instance, not 'tuple'
或者
byref() argument must be a ctypes instance, not 'list'

因为在python中并没有数组的数据类型,不知道怎么来传递这个数组,各位高人可以指点下吗?
c=c_int(2)
print "test arry:",dll.lkadd2(pointer(c),6)
改为sum += *as后.
from ctypes import *
dll = CDLL("libadd.so")
i=100
j=45
print "test add",i,"+",j,"=",dll.lkadd(i,j)
c=c_int(2)
print "test arry:",dll.lkadd2(pointer(c),6)
输出:

>>> test add 100 + 45 = 145
test arry: 12
from ctypes import *
dll = CDLL("libadd.so")
i=100
j=45
print "test add",i,"+",j,"=",dll.lkadd(i,j)
#c=c_int(2)
c=(c_int*6)(1,2,3,4,5,6)
print "test arry:",dll.lkadd2(pointer(c),6)



>>> test add 100 + 45 = 145
test arry: 21