如何通过 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++ 例程中使用该指针。
我正在尝试通过 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++ 例程中使用该指针。