Cómo exportar std :: vector

Estoy escribiendo la aplicación con la biblioteca boost.python. Quiero pasar la función a python que devuelve std::vector . Tengo un poco de problemas:

 inline std::vector getConfigListValue(const std::string &key) { return configManager().getListValue(key); } BOOST_PYTHON_MODULE(MyModule) { bp::def("getListValue", getListValue); } 

Cuando llamo a esa función desde python obtengo:

 TypeError: No to_python (by-value) converter found for C++ type: std::vector<std::string, std::allocator > 

¿Qué me he perdido?

Deberías escribir un convertidor como este:

 template struct VecToList { static PyObject* convert(const std::vector& vec) { boost::python::list* l = new boost::python::list(); for(size_t i = 0; i < vec.size(); i++) { l->append(vec[i]); } return l->ptr(); } }; 

Y luego registralo en tu modulo:

 BOOST_PYTHON_MODULE(MyModule) { boost::python::to_python_converter >, VecToList >(); boost::python::def("getListValue", getListValue); } 

Es una pregunta un poco antigua, pero he encontrado que si explícitamente necesita devolver por valor, así:

 namespace bp = boost::python BOOST_PYTHON_MODULE(MyModule) { bp::def("getListValue", getListValue, bp::return_value_policy()); } 

más bien que

 BOOST_PYTHON_MODULE(MyModule) { bp::def("getListValue", getListValue); } 

Python realiza la conversión por usted (estoy usando Python 2.7 en el momento de escribir esta respuesta) y no es necesario declarar / definir el convertidor.

@Tryskele

Utilizo las siguientes funciones de utilidad para convertir de / a contenedores stl. La función de sum trivial ilustra cómo se utilizan. Espero que puedas usarlo.

 #include  #include  #include  #include  namespace bpy = boost::python; namespace fm { template  bpy::list stl2py(const Container& vec) { typedef typename Container::value_type T; bpy::list lst; std::for_each(vec.begin(), vec.end(), [&](const T& t) { lst.append(t); }); return lst; } template  void py2stl(const bpy::list& lst, Container& vec) { typedef typename Container::value_type T; bpy::stl_input_iterator beg(lst), end; std::for_each(beg, end, [&](const T& t) { vec.push_back(t); }); } bpy::list sum(const bpy::list& lhs, const bpy::list& rhs) { std::vector lhsv; py2stl(lhs, lhsv); std::vector rhsv; py2stl(rhs, rhsv); std::vector result(lhsv.size(), 0.0); for (int i = 0; i < lhsv.size(); ++i) { result[i] = lhsv[i] + rhsv[i]; } return stl2py(result); } } // namespace fm BOOST_PYTHON_MODULE(entry) { // intended to be fast math's fast sum :) bpy::def("sum", &fm::sum); }