pybind11使用(3) 使用stl容器

假设c++侧读到的数据是一个结构体, 定义如下:

struct AirwayData
{
    int uavId;
    int routeId;
    std::vector<int> longitude;
    std::vector<int> latitude;
    std::vector<float> altitude;
    std::vector<float> speed;
};

这时导出时需要针对struct的每一个用到的变量进行导出

pybind11::class_<AirwayData>(m, "AirwayData")
    .def(pybind11::init<>())
    .def_readonly("uavId", &AirwayData::uavId)
    .def_readonly("routeId", &AirwayData::routeId)
    .def_readonly("longitude", &AirwayData::longitude)
    .def_readonly("latitude", &AirwayData::latitude)
    .def_readonly("altitude", &AirwayData::altitude)
    .def_readonly("speed", &AirwayData::speed);

如果在python端调用时访问了vector,则会异常退出

此时我做了个很坑的操作,把vector全部换成了list, 即:

struct AirwayData
{
    int uavId;
    int routeId;
    pybind11::list longitude;
    pybind11::list latitude;
    pybind11::list altitude;
    pybind11::list speed;
};

欸,可以正常访问了,但是只能调用一次就会异常退出,应该是pybind11::list的问题,可能是和python的引用计数什么的有关系?

正确做法是#include <pybind11/stl.h>, 这样pybind11会自动把vector转换为python的list, 文档

posted @ 2022-09-22 15:35  miyanyan  阅读(274)  评论(0编辑  收藏  举报