我想为我的C ++库创建一个python包装器。如果将std :: vector自动转换为python列表,反之亦然,这将是很酷的。 不幸的是,如果我将此代码添加到我的Interface-file中,我仍然会在运行时遇到错误。
%typemap(in) std::vector<float> value (std::vector<float> vIn) {
int iLen = PySequence_Length($input);
for(unsigned int i = 0; i < iLen; i++) {
PyObject *o = PySequence_GetItem($input, i);
if (PyNumber_Check(o)) {
vIn.push_back((float)PyFloat_AsDouble(o) );
}
}
$1 = vIn;
}
%typemap(out) std::vector<float> {
std::vector<float> vOut = $1;
int iLen = vOut.size();
$result = PyList_New(iLen);
for(unsigned int i = 0; i < iLen; i++) {
double fVal = vOut.at(i);
PyObject *o = PyFloat_FromDouble((double) fVal);
PyList_SetItem($result, i, o);
}
}
班级标题:
class TrainingSet {
private:
std::vector<std::vector<float> > m_vInputList;
std::vector<std::vector<float> > m_vOutputList;
public:
void AddInput(const std::vector<float> &vIn);
// ..
Python代码:
trainSet = TrainingSet()
trainSet.AddInput([0.5, 0.5, 0.5])
错误:
File "runSOMNet.py", line 9, in <module>
trainSet.AddInput([0.5, 0.5, 0.5])
File "/home/dgrat/annetgpgpu/build/ANNet/ANPyNetCPU.py", line 674, in AddInput
def AddInput(self, *args): return _ANPyNetCPU.TrainingSet_AddInput(self, *args)
NotImplementedError: Wrong number or type of arguments for overloaded function 'TrainingSet_AddInput'.
Possible C/C++ prototypes are:
ANN::TrainingSet::AddInput(std::vector< float,std::allocator< float > > const &)
ANN::TrainingSet::AddInput(float *,unsigned int const &)
答案 0 :(得分:2)
SWIG中的std_vector.i
库提供对std::vector
的支持。
http://www.swig.org/Doc2.0/Library.html#Library_stl_cpp_library
您只需告诉SWIG您希望它了解的模板实例:
%include "std_vector.i"
namespace std {
%template(FloatVector) vector<float>;
}
请注意,以下Python代码可以使用,但会产生数组副本:
for x in range(0, 3):
list[x] = x
myModule.myFunction(list)
要在不产生副本的情况下执行相同操作,请使用SWIG生成的代理对象构造函数构造列表:
list = myModule.FloatVector()
for x in range(0, 3):
list[x] = x
myModule.myFunction(list)
答案 1 :(得分:1)
如果您要手动定义%typemap
,则还需要%typemap(check)
,例如:
%typemap(typecheck) std::vector<float>& {
$1 = PySequence_Check($input) ? 1 : 0;
}
我相信经验法则是,如果你定义一个%typemap(in)
,你还应该定义一个%typemap(check)
---否则,生成的代码永远不会到达%typemap(in)
的位置。 }。