我正在尝试通过pybind11使一些C/C++代码在Python语言中可用,在C/C++代码中,返回一个指向数组的指针,我希望在Python语言中以列表或NumPy数组的形式访问该数组。
我测试了以下实现:
#include <pybind11/pybind11.h>
int* get_zeros(int n) {
int* a = new int[n];
memset(a, 0, n);
return a;
}
PYBIND11_MODULE(example, m) {
m.def("get_zeros", &get_zeros);
}但是当我在Python语言中调用get_zeros时,它只返回一个地址(如-1375731712),那么我如何使用pybind11访问Python语言中的数组呢?
谢谢!
发布于 2020-11-18 16:29:44
您需要返回一个pybind11解释为数组的类型。指针将不起作用,因为pybind11不知道数组的大小。
如果返回std::vector,或者如果是固定维度的std::array,则会将其转换为列表。
缺点是数据被复制,因此python中的修改在c++中不可见。
或者,您可以直接创建一个numpy数组(pybind11::array_t)并返回该数组。则不会复制任何数据,Python中的更改将在C++中可见,反之亦然。
您还可以在pybind11中从现有的数据缓冲区创建一个numpy数组,就像在Python中一样。但是,您需要自己进行生命周期管理。
您还可以在pybind11中创建自定义类,以实现Python使用的数组访问成员。通过这种方式,您可以将每个C++对象连接到python。
我建议你使用numpy数组。如果你坚持使用连续存储的特定内存布局(例如C或Fortran顺序),你可以从numpy数组中获取指向数据的指针,并在C++例程中使用该指针。
https://stackoverflow.com/questions/64888080
复制相似问题