【问题标题】:How to read list<object> from wrapped c++ class in python如何从 python 中包装的 c++ 类中读取 list<object>
【发布时间】:2013-12-17 10:56:19
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

既然你要返回一个列表,你应该公开它:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多