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



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

当包含额外的头文件pybind11/stl.h时,std::vector<>之间的转换/std::list<>/std::array<>,std::设置<>/std::unordered_set<>,和std::map<>/std::unordered_map<>并且Python列表、集合和dict数据结构被自动启用。

然而,我一辈子都无法做到这一点。我想我误解了什么,所以我希望有人能帮我澄清

以下是我期望的工作:

// 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中查找如何工作的示例,但我担心我很难破译该文件中发生的事情。

如果包含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);

不过,请记住,这会创建一个副本
有关其他方法,请参阅制作不透明类型和绑定stl容器。

最新更新