Расширение встроенного Python в C ++ - Разработка для взаимодействия с экземплярами C ++ - PullRequest
2 голосов
/ 11 мая 2011

Существует несколько пакетов, которые помогают автоматизировать задачу написания привязок между C \ C ++ и другими языками.

В моем случае я хотел бы связать Python, некоторые варианты для таких пакетов: SWIG , Boost.Python и Robin .

Кажется, что простой процесс состоит в том, чтобы использовать эти пакеты для создания C \ C ++ связываемых библиотек (в основном со статическими функциями) и расширять язык более высокого уровня, используя их.

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

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

Что я ищу, так это понимание дизайна, наиболее подходящего для этой ситуации.

Ответы [ 2 ]

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

Boost.python позволяет вам делать множество таких вещей прямо из коробки, особенно если вы используете умные указатели.Вы даже можете наследовать от классов C ++ в Python, а затем передавать их экземпляры обратно в свой код C ++, и все будет работать.Мой любимый ресурс о том, как делать различные вещи, это (особенно ознакомьтесь с разделом «Как»): http://wiki.python.org/moin/boost.python/.

Boost.python особенно хорош, если вы используете умные указатели илинавязчивые указатели, так как они прозрачно переводят в подсчет ссылок PyObject.Кроме того, очень хорошо, когда фабричные функции выглядят как конструкторы Python, что делает их очень чистыми API-интерфейсами Python.

Если вы не используете умные указатели, все равно можно делать все, что вы хотите, но выпридется возиться с различными политиками возврата и срока службы, которые могут вызвать головную боль.

1 голос
/ 15 октября 2017

Короче говоря: есть современная альтернатива pybind11.

Длинная версия: мне также пришлось встраивать python.Интерфейс C ++ Python небольшой, поэтому я решил использовать C Api.Это оказалось кошмаром.Открытые классы позволяют вам писать тонны сложного шаблонного кода.Boost :: Python значительно избегает этого, используя читаемые определения интерфейса.Тем не менее, я обнаружил, что в Boost отсутствует сложная документация и некоторые вещи, которые вы все еще должны называть API Python.Кроме того, их система сборки, кажется, доставляет людям неприятности.Я не могу сказать, так как я использую пакеты, предоставляемые системой.Наконец, я попробовал форсировать Python форк pybind11 и должен сказать, что он действительно удобен и исправляет некоторые недостатки форсирования, такие как необходимость использования Python Api, возможность использовать лямбда-выражения, отсутствие легкой понятной документации и автоматический перевод исключений.,Кроме того, это только заголовок, и он не требует огромной зависимости от развертывания, поэтому я могу порекомендовать его.

...