首页 > 解决方案 > 如何使用 pybind11 绑定 void 数组

问题描述

我的结构如下

struct _name{
  void* person[3];
}name;

我试图将元素复制到 python 数组中,但没有成功。

标签: pybind11

解决方案


你想如何使用绑定的结果?在 Python中没有这样的东西 aa void*,除非你想使用胶囊,所以最容易使用的是适当大小的整数类型,随后可以将其交给 ctypes、反弹等。

在 cpyy 中,我正是这样做的。例子:

import cppyy

cppyy.cppdef("""
typedef struct _name{
  void* person[3];
} name;
""")

n = cppyy.gbl.name()
print(n.person[0])

它将第一个指针指向的任何内容(在此示例中未初始化)打印为整数地址,并cppyy.bind_object()允许将指针重新绑定到代理。

要在 pybind11 中执行相同的操作,您可以执行以下操作:

#include <pybind11/pybind11.h>
#include <pybind11/pytypes.h>
#include <pybind11/numpy.h>

typedef struct _name {
  void* person[3];
} name;

PYBIND11_MODULE(name, m)
{
    pybind11::class_<name>(m, "name", pybind11::buffer_protocol())
        .def(pybind11::init<>())
        .def_property("person", [](name &n) -> pybind11::array {
            auto dtype = pybind11::dtype(pybind11::format_descriptor<uintptr_t>::format());
            auto base = pybind11::array(dtype, {3}, {sizeof(uintptr_t)});
            return pybind11::array(
                dtype, {3}, {sizeof(uintptr_t)}, n.person, base);
        }, [](name& n) {});
}

它为您提供了正确整数类型和长度的 numpy 数组。示例使用:

>>> import name
>>> n = name.name()
>>> n.person
array([0, 0, 0], dtype=uint64)
>>>

这些值再次发生在哪里,因为它们是未初始化的 w/oa 构造函数struct _name


推荐阅读