Как отправить PyCapsule из C ++ в python с помощью pybind11 - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь передать PyCapsule из C ++ в python, используя pybind11, но, похоже, не могу понять, как это сделать. Я провел пару дней, читая документы, но не могу понять, как сделать эту работу.

Я создал класс, который я хотел бы отправить на python. Я попытался создать экземпляр py :: капсулы в C ++ в функции getDataTensor и передать его python, используя PYBIND11_MODULE. Когда попробуйте код ниже, я получаю следующее сообщение об ошибке:

TypeError: Unable to convert function return value to a Python type! The signature was
    () -> DLTensor

Будем весьма благодарны за любые рекомендации по решению этой проблемы.

Мой код ниже:

class DLTensor{
public:
    double* data;
    int size;

    DLTensor():data{new double[10]},size{10}{}
};

py::capsule getDataTensor() { 
    std::unique_ptr<DLTensor> dlptr =std::unique_ptr<DLTensor>(new DLTensor());
    auto pybind_capsule= py::capsule(&dlptr,"DLTensorData",nullptr);
    return pybind_capsule; 
    }


namespace py = pybind11;

PYBIND11_MODULE(DBDLTensor, m) {
    m.def("getDataTesor", getDataTensor);

}

1 Ответ

0 голосов
/ 03 мая 2020

Мне удалось заставить код работать, поэтому я решил опубликовать свой метод.
Я пропустил определение py: class_ в PYBIND11_MODULE, и мне не хватало амперсанда при возврате результата в python.

см. Рабочий код ниже:

class DLTensor{
public:
    double* data;
    int size;

    DLTensor():data{new double[10]},size{10}{
    }
};

py::capsule getCapsuleDataTensor() { 
    DLTensor dltensor;
    auto pybind_capsule= py::capsule(&dltensor,"dltensor",nullptr);
    return pybind_capsule; 
    }

namespace py = pybind11;

PYBIND11_MODULE(DBDLTensor, m) {
    py::class_<DLTensor>(m, "DLTensor");
    m.def("getCapsuleDataTensor", &getCapsuleDataTensor);
}
...