首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过pybind11访问Python中的C/C++数组

如何通过pybind11访问Python中的C/C++数组
EN

Stack Overflow用户
提问于 2020-11-18 14:23:07
回答 1查看 590关注 0票数 0

我正在尝试通过pybind11使一些C/C++代码在Python语言中可用,在C/C++代码中,返回一个指向数组的指针,我希望在Python语言中以列表或NumPy数组的形式访问该数组。

我测试了以下实现:

代码语言:javascript
复制
#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语言中的数组呢?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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++例程中使用该指针。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64888080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档