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

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

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

  • Boost.Python

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

  • SWIG

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
41
0
12 521
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

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

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

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

Предлагаю ГЛОТОК. SIP лучше SWIG по следующим причинам:

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

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

Мне интересно это увидеть. Можете ли вы разместить это где-нибудь и дать ссылку на это? В противном случае мы можем организовать, чтобы вы отправили его мне.

Marcos Lara 13.11.2008 19:56

У машины обратного пути есть копия: web.archive.org/web/20070703071726/http://people.web.psi.ch/‌…

Peter Rowell 14.11.2008 03:00

Я не думаю, что тест имеет значение для SWIG. Автор не использует флаг -builtin или -O для SWIG, которые значительно улучшают производительность.

dbn 23.03.2018 01:55

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

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

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

+1 никогда не слышал об этом раньше и на самом деле выглядит неплохо.

ConcernedOfTunbridgeWells 14.11.2008 02:13

Ссылка не работает. Вот тот, который работает: pypi.python.org/pypi/Robin/1.0.1

Jason Sundram 27.08.2009 09:52

Спасибо Джейсон, ссылка на обновленный проект code.google.com/p/robin (вышла версия 1.0.4), отредактировал ответ.

orip 28.08.2009 16:41

В 2017 году: хотя этот ответ получил 18 голосов, этот проект, похоже, застрял в заброшенном репозитории Google Code, и остается неясным, был ли он возрожден где-то еще.

Lennart Rolland 01.09.2017 21:20

@LennartRolland - достаточно честно, последний выпуск от 2009 года и, вероятно, сейчас непригоден для использования

orip 03.09.2017 09:27

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

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

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

Другие вопросы по теме