如何从python </object>中的包装c ++类中读取列表<object>

时间:2013-12-17 10:56:20

标签: c++ python python-2.7 boost-python

我用c ++包装了类并暴露给python,当我调用函数成员时它工作,问题是我无法访问数据(类Path中的公共成员结果有类型std :: list

BOOST_PYTHON_MODULE(map) // module name
{
     class_<Path>("Path")
        .def_readonly("result", &Path::result)
        .def("findPathFromTo", &Path::findPathFromTo);

     class_<Position>("Position")
        .def(init<float, float, float>())
        .def_readwrite("x", &Position::x)
        .def_readwrite("y", &Position::y)
        .def_readwrite("z", &Position::z);
};

我打电话给

import map
path = map.Path()
path.findPathFromTo(2, 3, 34 ,34)
path.resultPath

最后一行抛出异常

TypeError: No Python class registered for C++ class std::list<Position, std::allocator<Position> >

1 个答案:

答案 0 :(得分:2)

由于您要返回一个列表,您应该公开它:

class_<std::list<Position>>("list_position")
    .def("__iter__", iterator<std::list<Position> >())
;

然后你可以迭代元素:

import map
path = map.Path()
path.findPathFromTo(2, 3, 34 ,34)
for p in path.resultPath: # is resultPath a std::list<Position>? I'm supposing YES.
    print p.x, p.y, p.z

正如您在@ janne-karila指出的链接中所注意到的那样,它可以改进python与std :: list交互的方式,提供清除,追加,删除等列表元素的方法。如果你想使用索引访问元素,我建议你使用std :: vector(这只是一个建议,不确定它是否适合你的需要)。