Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top