【问题标题】:How to access C/C++ arrays in Python via pybind11如何通过 pybind11 在 Python 中访问 C/C++ 数组
【发布时间】:2021-03-01 10:13:36
【问题描述】:

我正在尝试通过 pybind11 在 Python 中提供一些 C/C++ 代码,并且在 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),那么如何在 Python 中使用 pybind11 访问该数组?

谢谢!

【问题讨论】:

    标签: python c++ arrays pointers pybind11


    【解决方案1】:

    您需要返回一个 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++ 例程中使用该指针。

    【讨论】:

    • 谢谢,std::vector 有效,但需要包含pybind11/stl.h
    • 是的,很遗憾并非所有功能都包含在pybind11.h 中。我想您还需要包含numpy.h 才能使array_t 工作。
    猜你喜欢
    • 1970-01-01
    • 2011-07-01
    • 2020-02-29
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2022-12-25
    • 2019-01-16
    • 2021-12-28
    相关资源
    最近更新 更多