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

How to read list<object> from wrapped c++ class in python

本文关键字:列表 读取 包装 python lt object gt      更新时间:2023-10-16

我已经在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> >

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

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(这只是一个建议,不确定它是否适合您的需求)。