pybind11, конвертировать std :: vector в py :: list - PullRequest
0 голосов
/ 11 декабря 2018

Согласно документации pybind11 https://pybind11.readthedocs.io/en/stable/advanced/cast/stl.html:

При включении дополнительного заголовочного файла pybind11 / stl.h происходит преобразование между std :: vector <> / std :: list <> / std:: массивы <>, std :: set <> / std :: unordered_set <> и std :: map <> / std :: unordered_map <> и структуры данных списка, набора и dict в Python включаются автоматически.

Тем не менее, я не могу на всю жизнь заставить это работать.Я полагаю, что я что-то неправильно понимаю, поэтому я надеюсь, что кто-то может прояснить это для меня.

Вот то, что я ожидал работать:

// Test
std::vector<double> test_vec{1,2,3,4,5};
py::list test_list = test_vec;
py::list test_list2(test_vec);
py::list test_list3 = py::cast<py::list>(test_vec);

А вот ошибки:

error: conversion from ‘std::vector<double>’ to non-scalar type ‘pybind11::list’ requested
         py::list test_list = test_vec;

error: no matching function for call to ‘pybind11::list::list(std::vector<double>&)’
         py::list test_list2(test_vec);

error: no matching function for call to ‘cast(std::vector<double>&)’
         py::list test_list3 = py::cast<py::list>(test_vec)

В документах говорится, что в tests/test_stl.cpp приведены примеры того, как это должно работать, однако я боюсь, что у меня возникают проблемы с расшифровкой того, что происходит в этом файле.

1 Ответ

0 голосов
/ 22 февраля 2019

Преобразование происходит автоматически для аргументов функции и возвращаемых значений, для которых вы создаете привязки, если вы включаете pybind11/stl.h.Вы также можете сделать это явно в коде C ++, например:

#include <pybind11/stl.h>
// [...]
std::vector<double> test_vec{1, 2, 3, 4, 5};
py::list test_list3 = py::cast(test_vec);

Пожалуйста, имейте в виду, что это создает копию.Для другого подхода, пожалуйста, обратитесь к https://pybind11.readthedocs.io/en/stable/advanced/cast/stl.html#making-opaque-types и https://pybind11.readthedocs.io/en/stable/advanced/cast/stl.html#binding-stl-containers.

...