Используя pybind11 C ++ API и python3, как мы можем правильно создать массив объектов (то есть строки Юникода) в реализации C ++ и вернуть его обратно в python? Каков точный макет памяти базового массива данных, переданного в pybind11 :: array ()? Как именно нам нужно управлять памятью, т.е. удалять / освобождать?
Обратите внимание, что это необходимо, потому что мы хотим использовать этот массив строк в сочетании с другими массивами POD при создании DataFrame pandas.
Оказывается, что необходимо:
создать массив указателей PyObject, заполнить массив, т.е.
auto* pbuf = new PyObject*[arraySize]; // or create via pybind11 API...
pbuf[0] = <new object...>
pbuf[1] = <new object...>
etc.
создайте «объект» py :: array () с капсулой:
py::capsule freeWhenDone(pbuf, [](void* pp) {
delete [] (PyObject*)pp; // or else properly free the pbuf memory
});
arr = py::array(py::dtype("object"),
shape, strides, pbuf, freeWhenDone);
Других решений пока нет …