使用boost :: python,如何将结构向量作为字典列表返回给Python?

时间:2019-01-30 17:55:33

标签: python c++ boost boost-python

我有以下C ++代码:

    struct MyType { int x, y; };
    struct A { 
        std::vector<MyType> get_data();
    };

我想使用Boost Python连接到Python,以便可以通过以下方式使用它:

    a = A()
    ret = a.get_data();
    for r in ret:
        print('x=%d; y=%d;' % (r['x'], r['y']))

我现在所拥有的只是一个天真:

    BOOST_PYTHON_MODULE(pyA) { 
        class_<A>("A").def("get_data", &A::get_data);
    }

这给了我预期的以下错误

     TypeError: No to_python (by-value) converter found for C++ type

当我尝试从Python代码调用get_data()函数时。

我在这里看到过一些帖子(例如std::vector to boost::python::list),其中描述了如何使用vector_indexing_suitestd::vector<T>转换为某些类型{{1}的list }(例如浮点数,字符串),但是我不确定如何扩展它来处理struct-> dict转换。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

下面,如何将您的C++代码公开给PythonMyType需要“等于”比较运算符重载,并且MyType本身也需要暴露给Python

#include <boost/python.hpp>
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
using namespace boost::python;

struct MyType { 
    int x, y;  
    bool operator==(const MyType& data) const {
        return this->x == data.x && this->y == data.y;
    }   
};
struct A { 
    std::vector<MyType> get_data() const { return {{1,2},{3,4}};};
};

BOOST_PYTHON_MODULE(pyA) {
    class_<MyType>("MyType")
        .def_readwrite("x", &MyType::x)
        .def_readwrite("y", &MyType::y);
    class_<std::vector<MyType>>("MyList")
        .def(vector_indexing_suite<std::vector<MyType>>());
    class_<A>("A").def("get_data", &A::get_data);
}

在经过稍微修改的Python脚本下方。 get_data()返回类型属于列表,因此需要这样访问。如果您希望将其作为字典,请在Python中将其转换为字典。

import pyA 

a = pyA.A()
ret = a.get_data();
for r in ret:
    print('x=%d; y=%d;' % (r.x, r.y))

答案 1 :(得分:0)

最后,我采用了以下解决方案,如果将来对其他人有用,我将其发布在此处。可以通过添加boost的“只读”限定符来改进此功能,但我尚未这样做。

nav {
position: fixed;
width: 100%;
z-index: 10;
}