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

How to access C/C++ arrays in Python via pybind11

我正在尝试通过 pybind11 在 Python 中提供一些 C/C++ 代码,在 C/C++ 代码中,返回一个指向数组的指针,我想以列表或 NumPy 数组的形式访问 Python 中的数组。

我测试了以下实现:

#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中的数组?

谢谢!

您需要 return pybind11 解释为数组的类型。指针不起作用,因为 pybind11 不知道数组的大小。

如果你 return std::vector 或者在固定维度的情况下 std::array 这将被转换为列表。

缺点是复制了数据,所以python中的修改在c++中是不可见的

或者,您可以直接创建一个 numpy 数组 (pybind11::array_t),然后 return 直接创建它。这样就不会复制任何数据,Python 中的更改将在 C++ 中可见,反之亦然。

您还可以在 pybind11 中从现有数据缓冲区创建一个 numpy 数组,就像在 Python 中一样。但是,您需要自己进行生命周期管理。

您还可以在 pybind11 中创建自定义 class,实现 Python 使用的数组访问成员。通过这种方式,您可以将每个 C++ 对象连接到 python.

我建议您使用 numpy 数组。如果您坚持使用连续存储的特定内存布局(例如 C 或 Fortran 顺序),您可以从 numpy 数组中获取指向数据的指针,并在 C++ 例程中使用该指针。