Нетривиальное расширение C ++ для Python

У меня довольно большая библиотека C ++ с несколькими вспомогательными библиотеками, которые ее поддерживают, и мне нужно превратить все это в расширение Python. Я использую distutils, потому что он должен быть кроссплатформенным, но если есть лучший инструмент, я открыт для предложений.

Есть ли способ заставить distutils сначала скомпилировать подбиблиотеки и связать их при создании расширения из основной библиотеки?


person rogueg    schedule 12.08.2009    source источник


Ответы (1)


Я делаю это с помощью огромной библиотеки C ++ в нашем продукте. Существует несколько инструментов, которые могут помочь вам автоматизировать задачу написания привязок: самый популярный из них - SWIG, который существует некоторое время, используется во многих проектах и ​​в целом работает очень хорошо.

Самым большим аргументом против SWIG (на мой взгляд) является то, что кодовая база C ++ самого SWIG действительно, мягко говоря, довольно грубая. Он был написан до STL и имеет свою собственную полудинамическую систему типов, которая сейчас просто старая и скрипучая. Это не будет иметь большого значения, если вам когда-нибудь не придется застревать и вносить некоторые изменения в ядро ​​(однажды я пытался добавить преобразование doxygen -> docstring), но если вы это сделаете, удачи вам! Люди также говорят, что код, сгенерированный SWIG, не так эффективен, что может быть правдой, но для меня я никогда не считал, что вызовы SWIG являются достаточным узким местом, чтобы беспокоиться об этом.

Есть и другие инструменты, которые вы можете использовать, если SWIG не поддерживает вашу лодку: boost.python также популярен и может быть хорошим вариантом, если вы уже используете библиотеки boost в своем коде C ++. Обратной стороной является то, что он требует много времени на компиляцию, так как он почти полностью основан на шаблоне C ++.

Оба эти инструмента требуют, чтобы вы заранее поработали, чтобы определить, что будет раскрыто и как это будет сделано. Для SWIG вы предоставляете файлы интерфейса, которые похожи на заголовки C ++, но урезаны, и с некоторыми дополнительными директивами, чтобы сообщить SWIG, как переводить сложные типы и т. Д. Написание этих интерфейсов может быть утомительным, поэтому вы можете посмотреть что-то вроде pygccxml, чтобы помочь вам автоматически сгенерировать их для вас.

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

Некоторые другие вопросы, которые могут оказаться полезными в качестве справки:

Вы также можете найти это сравнение привязки инструменты для генерации Python удобны. Как отмечает Алекс в комментариях, сейчас он довольно старый, но, по крайней мере, дает вам некоторое представление о ландшафте ...

Что касается того, как управлять сборкой, вы можете захотеть взглянуть на более продвинутый встроенный инструмент, который distutils: если вы хотите придерживаться Python, я настоятельно рекомендую Waf в качестве основы (другие скажут вам SCons - правильный путь, но поверьте мне, он чертовски медленный: я уже был туда и обратно!) ... это требует небольшого обучения, но когда вы начинаете думать, это чрезвычайно мощно. И поскольку это чистый Python, он будет отлично интегрироваться с любым другим кодом Python, который у вас есть как часть процесса сборки (скажем, например, вы используете Py ++ в конце) ...

person jkp    schedule 12.08.2009
comment
Обратите внимание, что отчет ЦЕРН, который вы цитируете, так как этому сравнению более 6 лет, и поэтому к нему следует относиться с БОЛЬШОЙ долей скептицизма (!). В частности, протокол SIP сильно изменился за эти годы, поэтому сегодня он заслуживает рассмотрения. - person Alex Martelli; 12.08.2009