Ответ 1
Взаимодействие Python с C/С++ - непростая задача.
Здесь я копирую/вставляю предыдущий ответ по предыдущему вопросу о различных методах написания расширения python. Благодаря Boost.Python, SWIG, Pybindgen...
-
Вы можете написать расширение самостоятельно на C или С++ с помощью Python C-API.
Одним словом: не делайте этого, кроме как научиться делать это. Это очень сложно сделать правильно. Вам нужно будет увеличивать и уменьшать ссылки вручную и писать много кода, чтобы разоблачить одну функцию с очень небольшим количеством преимуществ.
-
Swig:
pro: вы можете создавать привязки для многих языков сценариев.
минусы: Мне не нравится, как работает парсер. Я не знаю, достигли ли они прогресса, но два года назад парсер С++ был довольно ограниченным. Большую часть времени мне приходилось копировать/вставлять мои .h заголовки, чтобы добавить несколько символов
%
и дать дополнительные подсказки для парсера swig.Мне также приходилось время от времени обрабатывать C-API Python для (не так) сложных преобразований типов.
Я больше не использую его.
-
про: Это очень полная библиотека. Это позволяет делать практически все, что возможно с C-API, но на С++. Мне никогда не приходилось писать код C-API с этой библиотекой. Я также не сталкивался с ошибкой из-за библиотеки. Код для привязок либо работает как шарм, либо отказывается компилировать.
Это, вероятно, одно из лучших доступных в настоящее время решений, если у вас уже есть библиотека С++ для привязки. Но если у вас есть только небольшая функция C для перезаписи, я бы, вероятно, попытался с Cython.
cons: если у вас нет предварительно скомпилированной библиотеки Boost.Python, вы собираетесь использовать Bjam (вроде замены make). Я действительно ненавижу Бьям и его синтаксис.
Библиотеки Python, созданные с B.P, как правило, страдают ожирением. Для компиляции также требуется лот.
-
Py ++: это Boost.Python упростился. Py ++ использует синтаксический анализатор С++ для чтения вашего кода, а затем автоматически генерирует код Boost.Python. У вас также есть отличная поддержка от его автора (нет, это не я;-)).
минусы: только проблемы, связанные с самим Boost.Python.
Изменить этот проект выглядит прекращенным. Хотя, возможно, все еще работает, лучше рассмотреть возможность переключения.
-
Он генерирует код, относящийся к 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, это может привести к длительному времени компиляции и большим библиотекам. Я еще не сделал никакого теста.