如何使用pybind11绑定一个空数组

时间:2019-11-14 19:10:58

标签: pybind11

我的结构如下

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

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

1 个答案:

答案 0 :(得分:0)

您想如何使用绑定结果?在Python中没有void*这样的东西,除非您可能想使用胶囊,所以最容易使用的是适当大小的整数类型,该整数类型随后可以传递给ctypes,反弹等。 / p>

在cppyy中,我正是这样做的。示例:

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)
>>>

这些值又恰好是它们的值,因为它们没有被struct _name的构造函数初始化。