pybind11 возвращает массив объектов

Используя pybind11 C ++ API и python3, как мы можем правильно создать массив объектов (то есть строки Юникода) в реализации C ++ и вернуть его обратно в python? Каков точный макет памяти базового массива данных, переданного в pybind11 :: array ()? Как именно нам нужно управлять памятью, т.е. удалять / освобождать?

Обратите внимание, что это необходимо, потому что мы хотим использовать этот массив строк в сочетании с другими массивами POD при создании DataFrame pandas.

0

Решение

Оказывается, что необходимо:

  1. создать массив указателей PyObject, заполнить массив, т.е.

    auto* pbuf = new PyObject*[arraySize]; // or create via pybind11 API...
    pbuf[0] = <new object...>
    pbuf[1] = <new object...>
    etc.
    
  2. создайте «объект» 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);
    
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]