Предоставление C ++ API для Python - PullRequest
40 голосов
/ 10 ноября 2008

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

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

  • Boost.Python

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

  • SWIG

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

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

Ответы [ 5 ]

23 голосов
/ 10 ноября 2008

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

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

18 голосов
/ 14 ноября 2008

РЕДАКТИРОВАТЬ - проект Robin, к сожалению, заброшен, и сегодня он будет бесполезен.

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

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

6 голосов
/ 13 ноября 2008

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

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

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

5 голосов
/ 10 ноября 2008

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

Упаковка C ++ с использованием этих инструментов немного сложнее, чем упаковка C, но это можно сделать. Здесь - это вики-страница об этом.

2 голосов
/ 11 мая 2009

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

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

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

...