Взаимодействие Python с C / C ++ - непростая задача.
Здесь я копирую / вставляю предыдущий ответ на предыдущий вопрос для различных методов написания расширения Python. Благодаря Boost.Python, SWIG, Pybindgen ...
Вы можете написать расширение самостоятельно на C или C ++ с помощью Python C-API .
Одним словом: не делайте этого, кроме как научиться это делать. Это очень сложно сделать правильно. Вам придется увеличивать и уменьшать ссылки вручную и писать много кода только для того, чтобы представить одну функцию с очень небольшим количеством преимуществ.
Swig
pro: вы можете создавать привязки для многих языков сценариев.
минусы: мне не нравится, как работает парсер. Я не знаю, добились ли они какого-то прогресса, но два года назад парсер C ++ был довольно ограниченным. Большую часть времени мне приходилось копировать / вставлять заголовки .h, чтобы добавить несколько символов %
и дать дополнительные подсказки анализатору swig.
Мне также приходилось время от времени иметь дело с C-API Python для (не очень) сложных преобразований типов.
Я больше этим не пользуюсь.
Boost.Python
про:
Это очень полная библиотека. Это позволяет вам делать практически все, что возможно с C-API, но на C ++. Мне никогда не приходилось писать код C-API с этой библиотекой. Я также никогда не сталкивался с ошибкой из-за библиотеки. Код для привязок либо работает как брелок, либо отказывается компилироваться.
Вероятно, это одно из лучших доступных решений, если у вас уже есть библиотека C ++ для привязки. Но если у вас есть только небольшая функция C для перезаписи, я, вероятно, попробую с Cython.
cons: если у вас нет предварительно скомпилированной библиотеки Boost.Python, вы собираетесь использовать Bjam (что-то вроде замены make). Я действительно ненавижу Bjam и его синтаксис.
Библиотеки Python, созданные с помощью B.P, имеют тенденцию к ожирению. Для их компиляции также требуется лот времени.
Py ++ : это Boost.Python стало проще. Py ++ использует синтаксический анализатор C ++ для чтения вашего кода, а затем автоматически генерирует код Boost.Python. У вас также есть большая поддержка от его автора (нет, это не я ;-)).
минусы: только проблемы из-за самого Boost.Python.
Редактировать Этот проект выглядит прекращенным. Хотя, вероятно, все еще работает, может быть, лучше рассмотреть возможность переключения.
Pybindgen
Генерирует код, связанный с C-API. Вы можете описать функции и классы в файле Python или позволить Pybindgen читать ваши заголовки и автоматически генерировать привязки (для этого используется pygccxml, библиотека python, написанная автором Py ++).
минусов: это молодой проект с меньшей командой, чем Boost.Python. Есть все еще некоторые ограничения: вы не можете выставлять свои собственные исключения C ++, вы не можете использовать множественное наследование для ваших классов C ++.
В любом случае, стоит попробовать!
Pyrex и Cython :
Здесь вы пишете не настоящий C / C ++, а смесь Python и C. Этот промежуточный код сгенерирует обычный модуль Python.
Редактировать 22 июля 2013: Теперь Py ++ выглядит прекращенным, сейчас я ищу хорошую альтернативу. В настоящее время я экспериментирую с Cython для моей библиотеки C ++. Этот язык представляет собой смесь между Python и C. Внутри функции Cython вы можете использовать сущности Python или C / C ++ (функции, переменные, объекты, ...).
Cython довольно прост в освоении, имеет очень хорошую производительность, и вы даже можете полностью избегать C / C ++, если вам не нужно взаимодействовать с устаревшими библиотеками C ++.
Однако для C ++ это связано с некоторыми проблемами. Он менее «автоматичен», чем Py ++, поэтому, вероятно, лучше для стабильного API C ++ (что в настоящее время относится к моей библиотеке). Самая большая проблема, которую я вижу с Cython, связана с полиморфизмом C ++. С Py ++ / boost: python я смог определить виртуальный метод в C ++, переопределить его в Python и вызвать версию Python в C ++. С Cython это все еще выполнимо, но вам нужно явно использовать C-Python API.
Изменить 2017-10-06:
Существует новый, pybind11 , похожий на Boost.Python, но с некоторыми потенциальными преимуществами. Например, он использует возможности языка C ++ 11, чтобы упростить создание новых привязок. Кроме того, это библиотека только для заголовков, поэтому перед ее использованием не нужно ничего компилировать, и нет библиотеки для ссылок.
Я немного поиграл с ним, и он действительно был довольно простым и приятным в использовании. Единственное, чего я боюсь, так это того, что, как и Boot.Python, это может привести к длительному времени компиляции и большим библиотекам. Я еще не сделал ни одного теста.