Предоставление С++ API для Python

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

Альтернативы, которые я пробовал, были:

  • Boost.Python

    Мне понравился более чистый API, созданный Boost.Python, но тот факт, что он потребовал бы, чтобы пользователи установили дополнительную зависимость, заставили нас переключиться на SWIG.

  • SWIG

    Основным преимуществом SWIG для нас было то, что он не требует, чтобы конечные пользователи установили его для использования окончательной программы.

Что вы использовали для этого, и каков был ваш опыт?

Ответ 1

Я использовал оба (для одного и того же проекта): Boost лучше интегрирован с STL и особенно исключениями С++. Кроме того, его механизм управления памятью (который пытается связать управление памятью С++ и Python GC) более гибкий, чем SWIG. Тем не менее, SWIG имеет гораздо лучшую документацию, никаких внешних зависимостей, и если вы получите библиотеку, завернутую в SWIG для Python, вы получите больше, чем на полпути туда, чтобы получить оболочку Java/Perl/Ruby.

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

Ответ 2

EDIT - проект Робин печально покинут, и сегодня он будет не очень полезен

Я использовал Robin с большим успехом.

Отличная интеграция с типами С++ и создает один .cpp файл для компиляции и включения в общий объект.

Ответ 3

Я предлагаю SIP. SIP лучше SWIG по следующим причинам:

  • Для заданного набора файлов swig генерирует более дублированный (служебный) код, чем SIP. SIP позволяет генерировать меньше дублирующегося (служебного) кода, используя файл библиотеки, который может быть статически или динамически связан. Другими словами, SIP обладает лучшей масштабируемостью.

  • Время выполнения SIP намного меньше, чем у SWIG. Обратитесь Инструменты Python Wrapper: исследование эффективности. К сожалению, ссылка выглядит сломанной. У меня есть личная копия, которая может быть предоставлена ​​по запросу.

Ответ 4

pyrex или cython также являются хорошими и легкими способами для смешивания двух миров.

Обтекание С++ с помощью этих инструментов немного сложнее, чем обертывание C, но это можно сделать. Здесь - это страница wiki об этом.

Ответ 5

Большим плюсом для Boost:: Python является то, что он позволяет завершить вкладку в оболочке ipython: вы импортируете класс С++, подвергаемый Boost напрямую, или вы подклассифицируете его, и с этого момента он действительно ведет себя как чистый Класс Python.

Недостаток: для установки и использования Boost требуется так много времени, что все временные сокращения времени закрытия табуляции никогда не будут амортизироваться; - (

Поэтому я предпочитаю Swig: нет колоколов и свистков, но надежно работает после краткого вводного примера.