使用Boost.python将Python列表传递给C++向量

Nei*_*l G 7 python vector boost-python

如何将我的对象类型的Python列表传递给ClassName接受vector<ClassName>?的C++函数?

我找到的最好的是这样的:例子.不幸的是,代码崩溃了,我似乎无法弄清楚原因.这是我用过的东西:

template<typename T>
void python_to_vector(boost::python::object o, vector<T>* v) {
    try {
      object iter_obj = object(handle<>(PyObject_GetIter(o.ptr())));
      return;
      for (;;) {
          object obj = extract<object>(iter_obj.attr("next")());
          // Should launch an exception if it cannot extract T
          v->emplace_back(extract<T>(obj));
      }
    } catch(error_already_set) {
        PyErr_Clear();
        // If there is an exception (no iterator, extract failed or end of the
        // list reached), clear it and exit the function
        return;
    }
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*ten 11

假设你有一个需要的功能 std::vector<Foo>

void bar (std::vector<Foo> arg)
Run Code Online (Sandbox Code Playgroud)

处理此问题的最简单方法是公开vectorto python.

BOOST_PYTHON_MODULE(awesome_module)
{
    class_<Foo>("Foo")
        //methods and attrs here
    ;

    class_<std::vector<Foo> >("VectorOfFoo")
        .def(vector_indexing_suite<std::vector<foo> >() )
    ;

    .def("bar", &bar)
}
Run Code Online (Sandbox Code Playgroud)

所以现在在python中我们可以将Foos键入a vector并将向量传递给bar

from awesome_module import *
foo_vector = VectorOfFoo()
foo_vector.extend(Foo(arg) for arg in arglist)
bar(foo_vector)
Run Code Online (Sandbox Code Playgroud)