LINUX.ORG.RU

Старая песня о главном: вызов Python из C++

 ,


0

3

Есть проект на C++. Надо вызывать некоторые функции (или лучше сказать, методы класса) из библиотеки, написанной на Python.

Я прочесал гуглинтернет и нашёл следующие наиболее распространённые подходы: использование Python C-API и Boost.Python. Дальше я впал в ступор, так как не могу выбрать лучший вариант. С одной стороны, Boost хорош всем, за исключением его «жирности». С другой стороны, C-API — это наиболее «прямой» путь, но есть подозрения, что делать обёртку Python-функций на нём — то ещё приключение...

Поэтому прошу помощи у гуру, кто уже делал что-либо подобное.

Упрощённый пример кода смогу подогнать, если потребуется...

Update: всем спасибо, остановился на pybind11 — просто и со вкусом :)

★★★★★

pybind11. Начинали как Boost.Python на диете, сейчас пишут что более фичасто, чем оригинал. Буст не пользовал, но pybind11 — норм.

ebantrop ()

Что подразумевается под жирностью Буста? Есть некоторые подозрения, что издержки использования Буста в плане производительности на фоне Пайтона крайне малы.

mkam ()
Ответ на: комментарий от mkam

жирность библиотек. Отсюда:

The main issue with Boost.Python—and the reason for creating such a similar project—is Boost. Boost is an enormously large and complex suite of utility libraries that works with almost every C++ compiler in existence.

Sahas ★★★★★ ()

есть подозрения, что делать обёртку Python-функций на нём — то ещё приключение...

Подозрения правильны.

Deleted ()

Сам не занимался таким, но по отзывам знакомых Boost.Python работает нормально.

zamazan4ik ★★ ()
Ответ на: комментарий от Deleted

Подозрения правильны.

был (не)удачный опыт?..

Я попробовал сделать обёртку через C-API — работает, но вот для преобразования типов требуется много «ручной» работы...

Sahas ★★★★★ ()
Ответ на: комментарий от Sahas

Подсчет ссылок выматывает, ну и сама конвертация данных в объекты пистона.

Deleted ()
Ответ на: комментарий от theLastOfCats

но если чего-то хватать

не распарсил

Sahas ★★★★★ ()
Ответ на: комментарий от Sahas

Писал с телефона, имел ввиду:

Если в pybind11 чего-то будет не хватать, то стоит свичнуться на Boost.Python

theLastOfCats ()

Можно еще на cython глянуть. Мне там понравилось, что усилий по связыванию кода нужно было приложить минимум, хотя и юзкейс был простой.

anonymous ()
Ответ на: комментарий от theLastOfCats

но если чего-то хватать, то Boost.

Тогда уж C-API, если чего то не хватит. А за базу pybind или boost::python

что то аналогичное делал, тоже надо было вызывать python методы из C++ и обратно python-у подсовывать C++ объекты. Использовал boost::python + кое где C-API пришлось использовать. Но pybind - вроде как заманчиво выглядит...

samson ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.