使用SWIG在Python中使用NumPy数组在struct中包装C指针
我有以下C结构:使用SWIG在Python中使用NumPy数组在struct中包装C指针,python,c,numpy,swig,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] 包装结构本身似乎是可行的:我可以给一些\u int赋值。然而,对于some\u
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]
包装结构本身似乎是可行的:我可以给一些\u int
赋值。然而,对于some\u int\u vector
,我得到了Python中的NoneType
。如果我给它赋值,就会得到错误
TypeError: in method 'my_struct_some_int_vector_set', argument 2 of type 'int_t const *'
经过几个小时的搜索,我仍然不知道如何连接这个。我知道numpy.I
,但使用它似乎需要事先知道向量维度
我还尝试了以下建议的类型映射:
%typemap(in)int_t*vec(int_t temp[$1\u dim0]){
int i;
如果(!PySequence_Check($input)){
PyErr_SetString(PyExc_ValueError,预期为序列);
SWIG_失败;
}
如果(PySequence_Length($input)!=1_dim0){
PyErr_SetString(PyExc_ValueError,“大小不匹配。预期为$1_dim0元素”);
SWIG_失败;
}
对于(i=0;i<$1_dim0;i++){
PyObject*o=PySequence\u GetItem($input,i);
如果(PyNumber_检查(o)){
温度[i]=(浮点)PyFloat\u为双精度(o);
}否则{
PyErr_SetString(PyExc_ValueError,“序列元素必须是数字”);
SWIG_失败;
}
}
$1=临时工;
}
但这似乎没有改变任何事情。我没有swig方面的经验,但您是否尝试使用元组而不是列表?正如在
ms.some_int_vector=(1,2,3)
中一样,我尝试过,但得到的错误消息与列表相同。我没有使用swig的经验,但您是否尝试过使用元组而不是列表?正如在ms.some_int_vector=(1,2,3)
中一样,我尝试过,但得到了与列表相同的错误消息。
%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;
}