我有以下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;
}
但这似乎没有任何改变。