Подтвердить что ты не робот

Интеграция Python и С++

Я изучаю С++, потому что это очень гибкий язык. Но для интернет-вещей, таких как Twitter, Facebook, Delicious и другие, Python кажется гораздо лучшим решением.

Можно ли интегрировать С++ и Python в один и тот же проект?

4b9b3361

Ответ 1

Взаимодействие Python с C/С++ - непростая задача.

Здесь я копирую/вставляю предыдущий ответ по предыдущему вопросу о различных методах написания расширения python. Благодаря Boost.Python, SWIG, Pybindgen...

  • Вы можете написать расширение самостоятельно на C или С++ с помощью Python C-API.

    Одним словом: не делайте этого, кроме как научиться делать это. Это очень сложно сделать правильно. Вам нужно будет увеличивать и уменьшать ссылки вручную и писать много кода, чтобы разоблачить одну функцию с очень небольшим количеством преимуществ.

  • Swig:

    pro: вы можете создавать привязки для многих языков сценариев.

    минусы: Мне не нравится, как работает парсер. Я не знаю, достигли ли они прогресса, но два года назад парсер С++ был довольно ограниченным. Большую часть времени мне приходилось копировать/вставлять мои .h заголовки, чтобы добавить несколько символов % и дать дополнительные подсказки для парсера swig.

    Мне также приходилось время от времени обрабатывать C-API Python для (не так) сложных преобразований типов.

    Я больше не использую его.

  • Boost.Python:

    про: Это очень полная библиотека. Это позволяет делать практически все, что возможно с C-API, но на С++. Мне никогда не приходилось писать код C-API с этой библиотекой. Я также не сталкивался с ошибкой из-за библиотеки. Код для привязок либо работает как шарм, либо отказывается компилировать.

    Это, вероятно, одно из лучших доступных в настоящее время решений, если у вас уже есть библиотека С++ для привязки. Но если у вас есть только небольшая функция C для перезаписи, я бы, вероятно, попытался с Cython.

    cons: если у вас нет предварительно скомпилированной библиотеки Boost.Python, вы собираетесь использовать Bjam (вроде замены make). Я действительно ненавижу Бьям и его синтаксис.

    Библиотеки Python, созданные с B.P, как правило, страдают ожирением. Для компиляции также требуется лот.

  • Py ++: это Boost.Python упростился. Py ++ использует синтаксический анализатор С++ для чтения вашего кода, а затем автоматически генерирует код Boost.Python. У вас также есть отличная поддержка от его автора (нет, это не я;-)).

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

    Изменить этот проект выглядит прекращенным. Хотя, возможно, все еще работает, лучше рассмотреть возможность переключения.

  • Pybindgen:

    Он генерирует код, относящийся к C-API. Вы можете описать функции и классы в файле Python или позволить Pybindgen читать заголовки и автоматически создавать привязки (для этого он использует pygccxml, библиотеку python, написанную автором Py ++).

    минус: это молодой проект с небольшой командой, чем Boost.Python. Есть еще некоторые ограничения: вы не можете раскрывать свои собственные исключения на С++, вы не можете использовать множественное наследование для своих классов С++.

    В любом случае стоит попробовать!

  • Pyrex и Cython:

    Здесь вы не пишете реальный C/С++, а смешиваете между Python и C. Этот промежуточный код будет генерировать регулярный модуль Python.

Редактировать Jul 22 2013: Теперь Py ++ выглядит прекращенным, теперь я ищу хорошую альтернативу. В настоящее время я экспериментирую с Cython для моей библиотеки С++. Этот язык представляет собой смесь между Python и C. Внутри функции Cython вы можете использовать либо объекты Python, либо C/С++ (функции, переменные, объекты,...).

Cython довольно легко учиться, имеет очень хорошую производительность, и вы даже можете полностью избежать C/С++, если вам не нужно связывать устаревшие библиотеки С++.

Однако для С++ возникают некоторые проблемы. Это меньше "автоматическое", чем Py ++, поэтому он, вероятно, лучше подходит для стабильного С++ API (который теперь имеет место в моей библиотеке). Самая большая проблема, которую я вижу с Cython, - это полиморфизм С++. С Py ++/boost: python Я смог определить виртуальный метод на С++, переопределить его в Python и иметь версию Python, которая вызывается внутри С++. С Cython это все еще выполнимо, но вам нужно явно использовать API C-Python.

Изменить 2017-10-06:

Существует новый, pybind11, подобно Boost.Python, но с некоторыми потенциальными преимуществами. Например, он использует возможности языка С++ 11, чтобы упростить создание новых привязок. Кроме того, это библиотека только для заголовков, поэтому перед ее использованием компилировать нечего, и никакой библиотеки для ссылки.

Я играл с ним немного, и это было действительно просто и приятно. Мой единственный страх в том, что, как и Boot.Python, это может привести к длительному времени компиляции и большим библиотекам. Я еще не сделал никакого теста.

Ответ 2

Да, это возможно, рекомендуется и документировано. Я сделал это сам и нашел, что это очень легко.

Ответ 3

Справочное руководство по API Python/C - API, используемый программистами на C и С++, которые хотят писать модули расширения или вставлять Python.

Расширение и встраивание интерпретатора Python

описывает, как писать модули на C или С++ для расширения интерпретатора Python с помощью новых модулей. Эти модули могут определять новые функции, а также новые типы объектов и их методы. В документе также описывается, как внедрить интерпретатор Python в другое приложение для использования в качестве языка расширения. Наконец, в нем показано, как компилировать и связывать модули расширения, чтобы они могли динамически (во время выполнения) загружаться в интерпретатор, если базовая операционная система поддерживает эту функцию.

Ответ 4

Попробуйте Pyrex. Делает проще писать расширения С++ для Python.

Ответ 5

Мы очень хорошо используем swig в нашем продукте.

В основном swig берет ваш код на С++ и создает вокруг него оболочку python.

Ответ 6

Я использовал PyCxx http://cxx.sourceforge.net/ в прошлом, и я обнаружил, что это очень хорошо.

Он обтекает API python c очень элегантным способом и делает его очень простым в использовании. Очень просто написать расширение python в С++. Он снабжен ясными примерами, поэтому его легко начать.

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

Ответ 7

Это зависит от ваших требований к переносимости. Некоторое время я боролся с этим, и я закончил перенос своего С++ с помощью python API, потому что мне нужно что-то, что работает в системах где администратор только взломал совместно действующую установку gcc и python.

В теории Boost.Python должен быть очень хорошим вариантом, поскольку Boost доступен (почти) везде. К сожалению, если вы закончите работу с ОС со старой установкой python по умолчанию (наше сотрудничество застряло с 2.4), вы столкнетесь с проблемами, если попытаетесь запустить Boost.Python с более новой версией (все мы используем Python 2.6). Поскольку ваш администратор, вероятно, не потрудился установить версию Boost, соответствующую каждой версии python, вам придется ее самостоятельно создать.

Итак, если вы не возражаете, если вам потребуется установка Boost для каждой системы, в которой работает ваш код, используйте Boost.Python. Если вам нужен код, который определенно будет работать в любой системе с Python и компилятором С++, используйте API Python.

Ответ 8

Вы можете написать расширения Python на С++. В основном сам Python написан на C, и вы можете использовать его для вызова кода C. У вас есть полный доступ к вашим объектам Python. Также проверьте Boost.Python.

Ответ 9

Смотрите это:

Расширение Python с помощью C или С++

"Довольно легко добавлять новые встроенные модули в Python, если вы знаете, как программировать на C. Такие модули расширения могут делать две вещи, которые невозможно сделать прямо в Python: они могут внедрять новые встроенные модули, в типах объектов, и они могут вызывать функции библиотеки C и системные вызовы.

Для поддержки расширений API Python (Application Programmers Interface) определяет набор функций, макросов и переменных, которые обеспечивают доступ к большинству аспектов системы времени исполнения Python. API Python включен в исходный файл C, включая заголовок "Python.h". "

http://www.python.org/doc/2.5.2/ext/intro.html

PS В нем написано "интегрировать":)

Ответ 10

Еще один интересный способ - генерация кода python, запустив сам python для синтаксического анализа файлов заголовков С++. Команда OpenCV успешно взяла этот подход, и теперь они сделали то же самое, чтобы сделать java-обертку для библиотеки OpenCV. Я нашел этот созданный более чистый Python API без ограничений, вызванный определенной библиотекой.

Ответ 11

Я бы рекомендовал посмотреть, как PyTorch делает свою интеграцию.