我有一个c函数要在python中使用:
extern int convertAtoB( stateStruct *myStruct,
const double PointA[3],
double PointB[3]);
使用swig,我想我需要定义一个类型映射来转换两点(pointa是输入,pointb是输出),这样python就可以使用它。TypeMaps中似乎没有TypeMap。我可以处理这个,所以我必须定义一个。我似乎在swig文档中找不到数组的例子。
我想这样使用这个库:
s = externalStruct()
point_a = [1, 2, 3]
result, point_b = convertAtoB(s, point_a)
print point_b
"expect [4, 5, 6]"
我该怎么做?谢谢
最佳答案
你就快到了。要去掉python签名中的伪参数,您需要将%typemap(in)
的PointB[3]
更改为%typemap(in,numinputs=0)
以指示swig忽略该输入值(您已经在复制它了)。这将从python方法签名中删除伪参数。
不过,我不确定是否需要复制整个%typemap(in)
来实现这个专门化。也许有一种方法可以重用实际的类型映射,但我不知道如何重用。否则你会得到额外的
%typemap(in,numinputs=0) double PointB[3] (double temp[$1_dim0]) {
int i;
if (!PySequence_Check($input)) {
PyErr_SetString(PyExc_ValueError,"Expected a sequence");
return NULL;
}
if (PySequence_Length($input) != $1_dim0) {
PyErr_SetString(PyExc_ValueError,"Size mismatch. Expected $1_dim0 elements");
return NULL;
}
for (i = 0; i < $1_dim0; i++) {
PyObject *o = PySequence_GetItem($input,i);
if (PyNumber_Check(o)) {
temp[i] = (double) PyFloat_AsDouble(o);
} else {
PyErr_SetString(PyExc_ValueError,"Sequence elements must be numbers");
return NULL;
}
}
$1 = temp;
}