使用SWIG在Python中使用NumPy数组包装C指针

时间:2017-01-23 15:14:28

标签: python c numpy swig

我有以下C结构:

struct my_struct {
    int some_int;
    const int *some_int_vector;
}

我想从Python接口(使用SWIG),如下所示:

>>> ms = my_struct()
>>> ms.some_int = 5
>>> ms.some_int_vector = [1,2,3]

包装结构本身似乎有效:我可以为some_int指定值。但是,对于some_int_vector,我在Python中获得NoneType。如果我给它分配了一些东西,我就会收到错误

TypeError: in method 'my_struct_some_int_vector_set', argument 2 of type 'int_t const *'

经过几个小时的搜索,我仍然很困惑如何界面。我知道numpy.i,但使用它似乎需要预先知道矢量尺寸。

我还尝试了SWIG tutorial中建议的类型地图:

%typemap(in) int_t *vec (int_t temp[$1_dim0]) {

int i;
if (!PySequence_Check($input)) {
    PyErr_SetString(PyExc_ValueError,"Expected a sequence");
    SWIG_fail;
  }
if (PySequence_Length($input) != $1_dim0) {
    PyErr_SetString(PyExc_ValueError,"Size mismatch. Expected $1_dim0 elements");
    SWIG_fail;
}
for (i = 0; i < $1_dim0; i++) {
    PyObject *o = PySequence_GetItem($input,i);
    if (PyNumber_Check(o)) {
        temp[i] = (float) PyFloat_AsDouble(o);
    } else {
        PyErr_SetString(PyExc_ValueError,"Sequence elements must be numbers");
        SWIG_fail;
    }
}
$1 = temp;
}

但这似乎没有任何改变。

0 个答案:

没有答案