pybind11,将std :: vector转换为py :: list

时间:2018-12-11 12:26:44

标签: pybind11

根据pybind11文档https://pybind11.readthedocs.io/en/stable/advanced/cast/stl.html

  

当包含附加头文件pybind11 / stl.h时,std :: vector <> / std :: list <> / std :: array <>,std :: set <> / std :: unordered_set < >和std :: map <> / std :: unordered_map <>以及Python列表,集合和字典数据结构会自动启用。

但是,我无法一辈子都可以使用它。我想我误会了一些东西,所以我希望有人能为我清除它。

这是我期望的工作:

// Test
std::vector<double> test_vec{1,2,3,4,5};
py::list test_list = test_vec;
py::list test_list2(test_vec);
py::list test_list3 = py::cast<py::list>(test_vec);

以下是错误:

error: conversion from ‘std::vector<double>’ to non-scalar type ‘pybind11::list’ requested
         py::list test_list = test_vec;

error: no matching function for call to ‘pybind11::list::list(std::vector<double>&)’
         py::list test_list2(test_vec);

error: no matching function for call to ‘cast(std::vector<double>&)’
         py::list test_list3 = py::cast<py::list>(test_vec)

文档说,应该在tests/test_stl.cpp中查找该文件应如何工作的示例,但是恐怕我很难理解该文件中正在发生的事情。

1 个答案:

答案 0 :(得分:2)

如果包含pybind11/stl.h,则函数参数和返回值将自动为您创建绑定的转换。您也可以像这样在C ++代码中明确地做到这一点:

#include <pybind11/stl.h>
// [...]
std::vector<double> test_vec{1, 2, 3, 4, 5};
py::list test_list3 = py::cast(test_vec);

但是请记住,这会创建一个副本。有关其他方法,请参考https://pybind11.readthedocs.io/en/stable/advanced/cast/stl.html#making-opaque-typeshttps://pybind11.readthedocs.io/en/stable/advanced/cast/stl.html#binding-stl-containers