std :: vector для boost :: python :: list
У меня есть метод в c ++, который вызывается из python и ему нужно вернуть объект списка python.
Я уже создал этот метод и привязан к открытому classу и вызывается из python прямо сейчас (он возвращает void).
Итак, вопрос в том, как мне создать список python из этого:
- использование Tor в качестве прокси
- Получает ли доступ к первому полю структуры с помощью C cast нарушает строгий псевдоним?
- Как удалить все не буквенно-цифровые символы из строки в c ++?
- Как применить фильтр при разбиении на страницы в ASP.NET MVC и сущности Framework?
- Правильный способ связи WSSE Usernametoken для SOAP webservice
std::vector results;
Я не понимаю, как работает конструктор из этой документации:
http://www.boost.org/doc/libs/1_37_0/libs/python/doc/v2/list.html
Кроме того … Я действительно не хочу возвращать вид обернутого вектора … Я просто хочу создать новый список python со строковыми значениями из вектора.
Мои извинения, если это дубликат … Я нашел довольно много списков для векторных вопросов, но я не смог найти ни одного создания нового списка python.
Я мог бы расширить этот вопрос, включив некоторые другие вопросы, такие как:
Создание нового словаря python из: std::map
и т. Д.
- Как сделать снимок экрана в OpenGL
- Сделать родительский wait для завершения всех дочерних процессов
- Как обрезать строку .NET?
- Каким образом реализация Майерсом Синглтона на самом деле является синглтон
- Возможна ли инъекция через динамический LINQ?
- В чем смысл термина «свободная функция» в C ++?
- Список стандартных файлов заголовков в C и C ++
- x86_64 ASM - максимальные байты для команды?
У меня есть эта функция, используя 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); }