使用SWIG从C返回到Python
我正在尝试使用以下C函数:使用SWIG从C返回到Python,python,c,swig,Python,C,Swig,我正在尝试使用以下C函数: void GetAttOrder(int node, DCE_ORDER order, float att[3]); 我想在Python中调用它并通过以下方式访问: node = 0; order = DCD_TYPR; attitude = GetAttOrder(node, order); attitude[0] // 45.232 在此之前,我将DCE_订单类型实现为 typedef enum { DCD_TPYR = 0, DCD_TYPR,
void GetAttOrder(int node, DCE_ORDER order, float att[3]);
我想在Python中调用它并通过以下方式访问:
node = 0; order = DCD_TYPR;
attitude = GetAttOrder(node, order);
attitude[0] // 45.232
在此之前,我将DCE_订单类型实现为
typedef enum
{
DCD_TPYR = 0,
DCD_TYPR,
DCD_TYRP,
...
DCD_PRYT
} DCE_ORDER;
我在中找到了一些关于类似问题的文档,但我没有实现任何解决方案。我还研究了其他一些stackoverflow问题(似乎很接近),但也没有结果。我怀疑我应该在这里使用类型图,但说到SWIG,我又年轻又愚蠢
有什么建议或建议吗
非常感谢。几天后解决了这个问题。如果你想要得到一个向量,你可以这样做:
%typemap(in, numinputs=0) float vec3out[3] (float temp[3]) {
$1 = temp;
}
%typemap(argout) float vec3out[3] {
int i;
$result = PyList_New(3);
for (i = 0; i < 3; i++) {
PyObject *o = PyFloat_FromDouble((double) $1[i]);
PyList_SetItem($result,i,o);
}
}
%typemap(in,numinputs=0)float vec3out[3](float temp[3]){
$1=临时工;
}
%类型映射(argout)浮点vec3out[3]{
int i;
$result=PyList_New(3);
对于(i=0;i<3;i++){
PyObject*o=PyFloat_FromDouble((double)$1[i]);
PyList_SetItem($result,i,o);
}
}
然后可以按照我上面的要求通过Python访问这个函数。此外,如果要将列表传递到另一个函数(getter/setter函数对),可以使用以下代码:
%typemap(in) float vec3in[3] (float temp[3]) {
int i;
if (!PySequence_Check($input)) {
PyErr_SetString(PyExc_ValueError,"Expected a sequence");
return NULL;
}
if (PySequence_Length($input) != 3) {
PyErr_SetString(PyExc_ValueError,"Size mismatch. Expected 3 elements");
return NULL;
}
for (i = 0; i < 3; 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");
return NULL;
}
}
$1 = temp;
}
%typemap(in)float vec3in[3](float temp[3]){
int i;
如果(!PySequence_Check($input)){
PyErr_SetString(PyExc_ValueError,预期为序列);
返回NULL;
}
如果(PySequence_长度($input)!=3){
PyErr_SetString(PyExc_ValueError,“大小不匹配。应为3个元素”);
返回NULL;
}
对于(i=0;i<3;i++){
PyObject*o=PySequence\u GetItem($input,i);
如果(PyNumber_检查(o)){
温度[i]=(浮点)PyFloat\u为双精度(o);
}否则{
PyErr_SetString(PyExc_ValueError,“序列元素必须是数字”);
返回NULL;
}
}
$1=临时工;
}
这将允许您传入一个列表。您是否尝试过创建一个重载
float*GetAttOrder(int节点,DCE\u顺序)
来调用您的GetAttOrder
?我相信SWIG知道如何将指针返回当作Python列表来对待。不,我没有尝试过,但我最终还是找到了一些可行的方法。我自己回答。