Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

std::vector to boost::python::list

I have a method in c++ that gets called from python and needs to return a python list object.

I have already created the method, and its attached to an exposed class and callable from python right now... (it returns void).

So the question is, how do I create a python list from this:

std::vector<std::string> results;

I am not really understanding how the constructor works from this documentation:

http://www.boost.org/doc/libs/1_37_0/libs/python/doc/v2/list.html

Also... I don't really want to return kind of wrapped vector... I just want to create a new python list with the string values from the vector.

My apologies if this is a duplicate... I found quite a few list to vector questions but I couldn't find any about creating a new python list.

I could expand this question to include some other questions like:

Creating a new python dictionary from a: std::map<std::string, std::string> and so on.

like image 718
mcot Avatar asked May 27 '11 20:05

mcot


2 Answers

boost::python already includes functionality for wrapping vectors and maps. Here's sample code for vectors, as you can see both passing and returning lists is quite simple:

// C++ code typedef std::vector<std::string> MyList; class MyClass {   MyList myFuncGet();   void myFuncSet(const Mylist& list);   //       stuff };  // Wrapper code  #include <boost/python/suite/indexing/vector_indexing_suite.hpp>  using namespace boost::python;   BOOST_PYTHON_MODULE(mymodule) {     class_<MyList>("MyList")         .def(vector_indexing_suite<MyList>() );      class_<MyClass>("MyClass")         .def("myFuncGet", &MyClass::myFuncGet)         .def("myFuncSet", &MyClass::myFuncSet)         ; } 

Maps are very similar to vectors and are described in this post: Boost::Python- possible to automatically convert from dict --> std::map?

Unfortunately boost::python does not currently include facilities for wrapping lists. You can create the wrapper manually, but I'm out of time for this answer. I can post it today or tomorrow. I'd appreciate a new question about this particular problem, because the answer will be quite extensive and is probably outside of the scope of this post. I'd just avoid lists and use vectors instead.

like image 52
Aleksey Vitebskiy Avatar answered Sep 28 '22 10:09

Aleksey Vitebskiy


I have this function using iterators to convert std::vector to py::list:

namespace py = boost::python;  template<class T> py::list std_vector_to_py_list(const std::vector<T>& v) {     py::object get_iter = py::iterator<std::vector<T> >();     py::object iter = get_iter(v);     py::list l(iter);     return l; } 
like image 26
rafak Avatar answered Sep 28 '22 10:09

rafak