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

mco*_*cot 40 c++ boost-python

我在c ++中有一个从python调用的方法,需要返回一个python列表对象.

我已经创建了这个方法,它附加到一个公开的类,现在可以从python中调用...(它返回void).

所以问题是,如何从这里创建一个python列表:

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

我真的不明白构造函数如何从这个文档中工作:

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

另外......我真的不想返回那种包装的矢量......我只是想用矢量中的字符串值创建一个新的python列表.

我很抱歉,如果这是重复...我找到了很多矢量问题的列表,但我找不到任何关于创建一个新的python列表.

我可以扩展这个问题,以包括一些其他问题,如:

从a创建一个新的python字典std::map<std::string, std::string>,依此类推.

Ale*_*kiy 60

boost::python已经包含了包装矢量和地图的功能.这是向量的示例代码,因为您可以看到传递和返回列表非常简单:

// 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)
        ;
}
Run Code Online (Sandbox Code Playgroud)

地图与矢量非常相似,并在本文中描述: Boost :: Python-可以自动转换为dict - > std :: map?

不幸的是boost::python,目前不包括包装列表的设施.您可以手动创建包装器,但我没有时间来回答这个问题.我可以今天或明天发布.我很欣赏关于这个特定问题的新问题,因为答案将非常广泛,可能超出了本文的范围.我只是避免使用列表并使用向量.

  • `vector_indexing_suite` 所做的就是为 `std::vector` 创建一个 python 包装器。这意味着可以直接访问 `std::vector`。这基本上是您希望的最低开销。这是链接:https://www.boost.org/doc/libs/1_68_0/libs/python/doc/html/reference/topics/indexing_support.html#topics.indexing_support.class_vector_indexing_suite。 (2认同)

raf*_*fak 14

我有这个函数使用迭代器转换std::vectorpy::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;
}
Run Code Online (Sandbox Code Playgroud)

  • 同样'找不到C++类型的to_python(按值)转换器:std :: vector <std :: string,std :: allocator <std :: string >>>,boost 1.48 (4认同)
  • 同样的错误,<type'exception.TypeError'>:找不到C++类型的to_python(by-value)转换器:std :: vector <double,std :: allocator <double >> (4认同)
  • 我试过这个,我得到一个例外`py :: object iter = get_iter(v)`:`没有找到C++类型的to_python(by-value)转换器:class std :: vector <int,class std :: allocator < int >>从Boost 1.51开始 (3认同)

eud*_*xos 8

如果你只想手动创建python列表(并且函数返回py :: list而不是vector),那么就这样做:

/* using namespace std; namespace py=boost::python;
   #define FOREACH BOOST_FOREACH
*/
vector<string> ss;
py::list ret;
FOREACH(const string& s, ss) ret.append(s);
return s;
Run Code Online (Sandbox Code Playgroud)

对于自动转换,定义从python列表到c ++的向量转换器以及从c ++到python列表的转换器 - 我刚刚在boost :: python实例化shared_ptr(回复的第二部分); 这样,你得到真正的python列表.

自动转换的另一种可能性(我没有经验)是使用indexing_suite,它将vector<string>作为python中的特殊类包装,作为此处提到的同事.


o.z*_*o.z 6

来自http://gist.github.com/octavifs/5362272:

// Converts a C++ vector to a python list
template <class T>
boost::python::list toPythonList(std::vector<T> vector) {
    typename std::vector<T>::iterator iter;
    boost::python::list list;
    for (iter = vector.begin(); iter != vector.end(); ++iter) {
        list.append(*iter);
    }
    return list;
}
Run Code Online (Sandbox Code Playgroud)