В настоящее время я работаю над проектом, в котором мне пришлось обернуть классы C++ с помощью Python, чтобы иметь возможность написать программу. Так что мой конкретный опыт также включал в себя встраивание интерпретатора Python в нашу программу.
Альтернативы, которые я пробовал, были:
Boost.Python
Мне понравился более чистый API, созданный Boost.Python, но тот факт, что для этого потребовалось бы, чтобы пользователи устанавливали дополнительную зависимость, заставил нас переключиться на SWIG.
SWIG
Основным преимуществом SWIG для нас было то, что конечным пользователям не требовалось устанавливать его для использования окончательной версии программы.
Что вы для этого использовали и каков был ваш опыт с этим?





Я использовал оба (для одного проекта): Boost лучше интегрирован с STL, и особенно с исключениями C++. Кроме того, его механизм управления памятью (который пытается связать управление памятью C++ и Python GC) более гибкий, чем у SWIG. Однако у SWIG есть лучшая документация много, нет внешних зависимостей, и если вы получите библиотеку, обернутую в SWIG для Python, вы более чем на полпути к получению оболочки Java / Perl / Ruby.
Я не думаю, что есть однозначный выбор: для небольших проектов я бы снова выбрал Boost.Python, для более крупных долгоживущих проектов дополнительные вложения в SWIG того стоят.
Предлагаю ГЛОТОК. SIP лучше SWIG по следующим причинам:
Для заданного набора файлов swig генерирует больше повторяющегося (служебного) кода, чем SIP. SIP удается генерировать меньше дублированного (накладного) кода с помощью файла библиотеки, который может быть статически или динамически связан. Другими словами, SIP имеет лучшую масштабируемость.
Время выполнения SIP намного меньше, чем у SWIG. Обратитесь к Инструменты оболочки Python: исследование производительности. К сожалению, ссылка не работает. У меня есть личная копия, которой можно поделиться по запросу.
У машины обратного пути есть копия: web.archive.org/web/20070703071726/http://people.web.psi.ch/…
Я не думаю, что тест имеет значение для SWIG. Автор не использует флаг -builtin или -O для SWIG, которые значительно улучшают производительность.
РЕДАКТИРОВАТЬ - проект Robin, к сожалению, заброшен, и сегодня он не будет много использоваться
Я использовал Робин с большим успехом.
Большой интегрируется с типами C++ и создает один файл .cpp для компиляции и включения в ваш общий объект.
+1 никогда не слышал об этом раньше и на самом деле выглядит неплохо.
Ссылка не работает. Вот тот, который работает: pypi.python.org/pypi/Robin/1.0.1
Спасибо Джейсон, ссылка на обновленный проект code.google.com/p/robin (вышла версия 1.0.4), отредактировал ответ.
В 2017 году: хотя этот ответ получил 18 голосов, этот проект, похоже, застрял в заброшенном репозитории Google Code, и остается неясным, был ли он возрожден где-то еще.
@LennartRolland - достаточно честно, последний выпуск от 2009 года и, вероятно, сейчас непригоден для использования
Большой плюс Boost :: Python заключается в том, что он позволяет выполнять завершение табуляции в оболочке ipython: вы импортируете класс C++, предоставляемый Boost напрямую, или вы подклассифицируете его, и с этого момента он действительно ведет себя как чистый класс Python.
Обратная сторона: установка и использование Boost занимает так много времени, что вся экономия времени на завершение вкладки никогда не окупится ;-(
Поэтому я предпочитаю Swig: без наворотов, но надежно работает после небольшого вводного примера.
Мне интересно это увидеть. Можете ли вы разместить это где-нибудь и дать ссылку на это? В противном случае мы можем организовать, чтобы вы отправили его мне.