std :: vector для boost :: python :: list

У меня есть метод в c ++, который вызывается из python и ему нужно вернуть объект списка python.

Я уже создал этот метод и привязан к открытому classу и вызывается из python прямо сейчас (он возвращает void).

Итак, вопрос в том, как мне создать список python из этого:

std::vector results;

Я не понимаю, как работает конструктор из этой документации:

http://www.boost.org/doc/libs/1_37_0/libs/python/doc/v2/list.html

Кроме того … Я действительно не хочу возвращать вид обернутого вектора … Я просто хочу создать новый список python со строковыми значениями из вектора.

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

Я мог бы расширить этот вопрос, включив некоторые другие вопросы, такие как:

Создание нового словаря python из: std::map и т. Д.

У меня есть эта функция, используя iteratorы для преобразования std::vector в py::list :

 namespace py = boost::python; template py::list std_vector_to_py_list(const std::vector& v) { py::object get_iter = py::iterator >(); py::object iter = get_iter(v); py::list l(iter); return l; } 

boost::python уже включает функции для переноса векторов и карт. Вот пример кода для векторов, так как вы можете видеть как проездные, так и возвращающиеся списки:

 // C++ code typedef std::vector MyList; class MyClass { MyList myFuncGet(); void myFuncSet(const Mylist& list); // stuff }; // Wrapper code #include  using namespace boost::python; BOOST_PYTHON_MODULE(mymodule) { class_("MyList") .def(vector_indexing_suite() ); class_("MyClass") .def("myFuncGet", &MyClass::myFuncGet) .def("myFuncSet", &MyClass::myFuncSet) ; } 

Карты очень похожи на векторы и описаны в этом сообщении: Boost :: Python – возможно автоматическое преобразование из dict -> std :: map?

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

Если вы хотите только создать список python вручную (и вернуть функцию py :: list, а не вектор), выполните следующие действия:

 /* using namespace std; namespace py=boost::python; #define FOREACH BOOST_FOREACH */ vector ss; py::list ret; FOREACH(const string& s, ss) ret.append(s); return s; 

Для автоматических преобразований определите конвертер для вектора из списка python в c ++ и из c ++ в список python – я только что написал об этом в Instantiation shared_ptr’s в boost :: python (вторая часть ответа); Таким образом, вы получаете реальные списки python.

Еще одна возможность автоматического преобразования (с которой у меня нет опыта) заключается в использовании indexing_suite, который переносит vector в качестве специального classа в python, как уже упоминавшийся здесь коллега.

С http://gist.github.com/octavifs/5362272 :

 // Converts a C++ vector to a python list template  boost::python::list toPythonList(std::vector vector) { typename std::vector::iterator iter; boost::python::list list; for (iter = vector.begin(); iter != vector.end(); ++iter) { list.append(*iter); } return list; } 

FWIW, вот шаблонная функция в том же духе, что и решение eudoxos:

 namespace py = boost::python; template py::list std_vector_to_py_list(const std::vector& v) { py::list l; typename std::vector::const_iterator it; for (it = v.begin(); it != v.end(); ++it) l.append(*it); return l; } 

Я использую следующие функции утилиты для преобразования из / в stl-контейнеры. Тривиальная функция суммы показывает, как они используются. Также я нашел следующий пакет с открытым исходным кодом, который имеет довольно много утилит преобразования: https://github.com/cctbx/cctbx_project/tree/master/scitbx/boost_python

 #include  #include  #include  #include  namespace bpy = boost::python; namespace fm { template  bpy::list stl2py(const Container& vec) { typedef typename Container::value_type T; bpy::list lst; std::for_each(vec.begin(), vec.end(), [&](const T& t) { lst.append(t); }); return lst; } template  void py2stl(const bpy::list& lst, Container& vec) { typedef typename Container::value_type T; bpy::stl_input_iterator beg(lst), end; std::for_each(beg, end, [&](const T& t) { vec.push_back(t); }); } bpy::list sum(const bpy::list& lhs, const bpy::list& rhs) { std::vector lhsv; py2stl(lhs, lhsv); std::vector rhsv; py2stl(rhs, rhsv); std::vector result(lhsv.size(), 0.0); for (int i = 0; i < lhsv.size(); ++i) { result[i] = lhsv[i] + rhsv[i]; } return stl2py(result); } } // namespace fm BOOST_PYTHON_MODULE(fm) { bpy::def("sum", &fm::sum); } 
  • не удалось сериализовать ответ в Web API
  • Как сравнить два объекта в модульном тесте?
  • Зачем использовать class C # System.Random вообще, а не System.Security.Cryptography.RandomNumberGenerator?
  • Преобразование образа доступа OLE Object в массив байтов исходного изображения в C #
  • Как преобразовать escape-строку JSON в объект JSON?
  • OpenCV C ++ / Obj-C: Обнаружение листа бумаги / Квадратное обнаружение
  • Статический readonly vs const
  • Как добавить ссылку .dll в проект в Visual Studio
  • Как создать собственный собственный stream / streambuf?
  • Несколько расширений файлов searchPattern для System.IO.Directory.GetFiles
  • Метод HTML.ActionLink
  • Давайте будем гением компьютера.