使用ctypes访问变量数组的内容

时间:2010-09-01 16:51:57

标签: python pointers multidimensional-array ctypes

我使用ctypes访问python中读取C函数的文件。由于读取的数据很大且未知,我在C中使用**float

int read_file(const char *file,int *n_,int *m_,float **data_) {...}

函数mallocs是一个名为data的二维数组,具有适当的大小,此处为nm,并将值复制到引用的值。请参阅以下代码段:

*data_ = data;
*n_ = n;
*m_ = m;

我使用以下python代码访问此函数:

p_data=POINTER(c_float)
n=c_int(0)
m=c_int(0)
filename='datasets/usps'
read_file(filename,byref(n),byref(m),byref(p_data))

之后我尝试使用p_data访问contents,但我只获得一个浮点值。

p_data.contents
c_float(-1.0)

我的问题是:如何在python中访问data

你推荐什么?如果我遗漏了不明确的内容,请不要犹豫!

1 个答案:

答案 0 :(得分:3)

使用struct库在python中执行整个操作可能更简单。但如果你是在ctypes上卖的(我不怪你,这很酷):

#include <malloc.h>
void floatarr(int* n, float** f)
{
    int i;
    float* f2 = malloc(sizeof(float)*10);
    n[0] = 10;
    for (i=0;i<10;i++)
    { f2[i] = (i+1)/2.0; }
    f[0] = f2;
}

然后在python:

from ctypes import *

fd = cdll.LoadLibrary('float.dll')
fd.floatarr.argtypes = [POINTER(c_int),POINTER(POINTER(c_float))]

fpp = POINTER(c_float)()
ip = c_int(0)
fd.floatarr(pointer(ip),pointer(fpp))
print ip
print fpp[0]
print fpp[1]

诀窍是大写POINTER生成一个类型,小写pointer生成一个指向现有存储的指针。您可以使用byref代替pointer,他们声称速度更快。我更喜欢pointer,因为它更清楚发生了什么。