Как можно передать пользовательскую структуру (вектор указателей) из C ++ в python, используя pybind11? - PullRequest
1 голос
/ 02 апреля 2019

Для проекта мне нужно передать структуру C ++ в Python в качестве входных данных. Я не очень хорошо знаком с C ++, поэтому мне сложно понять, как это сделать. Я получаю ошибку:

libc ++ abi.dylib: завершается с необработанным исключением типа pybind11 :: cast_error: Невозможно преобразовать аргумент вызова 'variable' типа 'Example' в объект Python

Поскольку я явно не говорю Python, как точно преобразовать структуру.

Буду очень признателен за любые подсказки или отзывы о том, как это сделать. Спасибо:)

//example.cpp
#include <pybind11/pybind11.h>
#include <pybind11/embed.h>
#include <pybind11/stl.h>
#include <memory>


// USE TO COMPILE: g++ -fPIC `python3 -m pybind11 --includes` -undefined dynamic_lookup -std=c++11 -O2 example.cpp -o example -L/usr/local/Cellar/python/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/ `python3-config --libs`

using namespace std;
namespace py = pybind11;
using namespace py::literals; // to bring in the `_a` literal

int MAX_LEN=10;
typedef double Real;

struct Example
{
  Example()
  {
    vector1.reserve(MAX_LEN);
    vector2.reserve(MAX_LEN);
  }
  std::vector<std::vector<Real>> vector1;
  std::vector<std::vector<Real>> vector2;
  ~Example() { clear(); }
  void clear()
  {
    vector1.clear();
    vector2.clear();
  }

};

PYBIND11_EMBEDDED_MODULE(exampleModule, m){
    py::class_<Example>(m, "Example")
    .def(py::init<>());
}


int main(void){
  py::scoped_interpreter guard{};
    py::dict locals;

  Example ex;
  ex.vector1 = std::vector <vector<Real>> (MAX_LEN, vector<Real>(MAX_LEN, 1.0));
  ex.vector2 = std::vector <vector<Real>> (MAX_LEN, vector<Real>(MAX_LEN, 2.0));
  locals = py::dict("variable"_a=ex);
  py::exec(R"(

      print(variable)

    )", py::globals(), locals);


    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...