Python Swig-自定义对象的向量作为返回参数 如果我有这样的C++函数…< /p>
Python Swig-自定义对象的向量作为返回参数 如果我有这样的C++函数…< /p>,python,vector,swig,Python,Vector,Swig,intmyfunc(inta,std::vector*b) 我的档案里有这个 %include "std_vector.i" namespace std { %template(vectormyobj) vector<MyObj>; } %apply std::vector*输出{std::vector*} 然后在python中我可以做到这一点 bout = mylib.vectormyobj() _ = mylib.myfunc(1,bout) %typemap(in,
intmyfunc(inta,std::vector*b)代码>
我的档案里有这个
%include "std_vector.i"
namespace std {
%template(vectormyobj) vector<MyObj>;
}
%apply std::vector*输出{std::vector*}代码>
然后在python中我可以做到这一点
bout = mylib.vectormyobj()
_ = mylib.myfunc(1,bout)
%typemap(in,numinputs=0) std::vector<MyNamespace::MyProject::MyObj>* {
// Create a persistent object to hold the result;
$1 = new std::vector<MyNamespace::MyProject::MyObj>;
}
%typemap(argout) std::vector<MyNamespace::MyProject::MyObj>* (PyObject* tmp) {
// Store the persistent object in a PyObject* that will be destroyed
// when it goes out of scope.
tmp = PyList_New($1->size());
for(auto i = 0; i < $1->size(); ++i) {
PyObject *junk;
junk = SWIG_NewPointerObj((new MyNamespace::MyProject::MyObj((*$1)[i])),
SWIGTYPE_p_MyNamespace__MyProject__MyObj,
SWIG_POINTER_OWN);
PyList_SET_ITEM(tmp, i, junk);
}
$result = SWIG_Python_AppendOutput($result, tmp);
}
\uuBout=mylib.myfunc(1)
而且,bout
将是一个浮动列表,就像我想要的那样……耶
<>但是现在我想在C++中做这个……/P>
intmyfunc(inta,std::vector*b)代码>
简单地做以下事情是行不通的
%apply std::vector*输出{std::vector*}代码>
它在Python中为ma提供了错误的参数类型或数量错误。我找到了一个不太理想的方法,通过将此添加到我的.I文件中来实现它
%include "std_vector.i"
namespace std {
%template(vectormyobj) vector<MyObj>;
}
在本例中,bout
是我的自定义类型列表,一切都很好……除了我真的想把bout
放在=的左侧,而不是作为参数传入。似乎我需要一些%typemap(in)和/或%typemap(argout)的Swig-fu来让它工作,但我一直无法让我的大脑围绕它
有人能提供指导吗?我终于想出了如何使这项工作起作用
首先,为了与我的示例更相关,让我们假设MyObj实际上位于某些名称空间中,以便像MyNamespace::MyProject::MyObj
一样访问它。所以要包装的函数看起来像
int myfunc(int a, std::vector<MyNamespace::MyProject::MyObj> *b);