开发者

Extending embedded Python in C++ - Design to interact with C++ instances

开发者 https://www.devze.com 2023-03-04 22:43 出处:网络
There are several packages out there that help in automating the task of writing bindings between C\\C++ and other languages.

There are several packages out there that help in automating the task of writing bindings between C\C++ and other languages.

In my case, I'd like to bind Python, some options for such packages are: SWIG, Boost.Python and Robin.

It seems that the straight forward process is to use these packages to create C\C++ linkable libraries (with mostly static functions) and have the higher language be extended using them.

However, my situation is that I already have a developed working system in C++ therefore plan to embed Python into it so that future development will be in Python.

It's not clear to me how, and if at all possible, to use these packages in helping to extend embedded Python in such a way that the Python code would be able to interact with the various Singleton instances already running in the system, and instantiate C++ classes and interact with them.

What I'm looking for is an insight regarding the desi开发者_运维技巧gn best fitted for this situation.


Boost.python lets you do a lot of those things right out of the box, especially if you use smart pointers. You can even inherit from C++ classes in Python, then pass instances of those back to your C++ code and have everything still work. My favorite resource on how to do various stuff is this (especially check out the "How To" section): http://wiki.python.org/moin/boost.python/ .

Boost.python is especially good if you're using smart pointers or intrusive pointers, as those translate transparently into PyObject reference counting. Also, it's very good at making factory functions look like Python constructors, which makes for very clean Python APIs.

If you're not using smart pointers, it's still possible to do all the things you want, but you have to mess with various return and lifetime policies, which can give you a headache.


To make it short: There is the modern alternative pybind11.

Long version: I also had to embed python. The C++ Python interface is small so I decided to use the C Api. That turned out to be a nightmare. Exposing classes lets you write tons of complicated boilerplate code. Boost::Python greatly avoids this by using readable interface definitions. However I found that boost lacks a sophisticated documentation and dor some things you still have to call the Python api. Further their build system seems to give people troubles. I cant tell since i use packages provided by the system. Finally I tried the boost python fork pybind11 and have to say that it is really convenient and fixes some shortcomings of boost like the necessity of the use of the Python Api, ability to use lambdas, the lack of an easy comprehensible documentation and automatic exception translation. Further it is header only and does not pull the huge boost dependency on deployment, so I can definitively recommend it.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号