Providing a Python wrapper to a C++ type.

M

Marco Nawijn

Hi,



I have a C++ module where I have a defined, working type. How would I make a wrapper for this type to be able to be used in Python? I am familiar(-ish) with the C-API for functions but I can't see concretely how one would include an interface to a type.



Is it this? http://docs.python.org/release/2.7.3/extending/newtypes.html



Regards,

Aaron

Hi Aaron,

There are a few ways of doing this. At least three come to my mind:
1. Wrap the C++ type yourself by using handcrafted code implemented with the Python C API
2. Use SWIG to wrap the C++ code and (semi) automatically create the wrapper (http://www.swig.org/)
3. Use BOOST Python to wrap the C++ code (http://www.boost.org/doc/libs/1_51_0/libs/python/doc/index.html)

I would highly discourage (1) unless you are very brave and curious. Ofcourse it is a nice excercise, but if you want something to work quickly I would recommend to use either (2) or (3).

I have used both SWIG and BOOST Python and either of them worked pretty well for me. In the end I selected BOOST Python, because I was only interested in the Python wrapping (SWIG could generate many other wrappers as well).

Regards,

Marco
 
S

Stefan Behnel

Marco Nawijn, 16.10.2012 12:17:
There are a few ways of doing this. At least three come to my mind:
1. Wrap the C++ type yourself by using handcrafted code implemented with the Python C API
2. Use SWIG to wrap the C++ code and (semi) automatically create the wrapper (http://www.swig.org/)
3. Use BOOST Python to wrap the C++ code (http://www.boost.org/doc/libs/1_51_0/libs/python/doc/index.html)

I would highly discourage (1) unless you are very brave and curious. Ofcourse it is a nice excercise, but if you want something to work quickly I would recommend to use either (2) or (3).

I have used both SWIG and BOOST Python and either of them worked pretty well for me. In the end I selected BOOST Python, because I was only interested in the Python wrapping (SWIG could generate many other wrappers as well).

There's also Cython, which provides a very flexible way (unlike SWIG) of
doing these things easily (unlike C++ with Boost).

http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html

I agree with discouraging 1) in specific.

Stefan
 
M

Marco Nawijn

Marco Nawijn, 16.10.2012 12:17:







There's also Cython, which provides a very flexible way (unlike SWIG) of

doing these things easily (unlike C++ with Boost).



http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html



I agree with discouraging 1) in specific.



Stefan

Hi Stefan,

I never worked with Cython (but I know it is very powerful and interesting)but in my mind there are slight differences in usage scenario between e.g.Boost Python and Cython. For me the idea of Cython is that your main code is in Python, but you want to improve the performance of specific parts of the code. In that case, Cython is the way to go. In case of Boost Python, the scenario for me is that you have a main program/library in C++, but you want to be able use the functionality from Python.

Do you agree with this view?

Marco
 
M

Marco Nawijn

Marco Nawijn, 16.10.2012 12:17:







There's also Cython, which provides a very flexible way (unlike SWIG) of

doing these things easily (unlike C++ with Boost).



http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html



I agree with discouraging 1) in specific.



Stefan

Hi Stefan,

I never worked with Cython (but I know it is very powerful and interesting)but in my mind there are slight differences in usage scenario between e.g.Boost Python and Cython. For me the idea of Cython is that your main code is in Python, but you want to improve the performance of specific parts of the code. In that case, Cython is the way to go. In case of Boost Python, the scenario for me is that you have a main program/library in C++, but you want to be able use the functionality from Python.

Do you agree with this view?

Marco
 
S

Stefan Behnel

Marco Nawijn, 16.10.2012 13:46:
I never worked with Cython (but I know it is very powerful and
interesting) but in my mind there are slight differences in usage
scenario between e.g. Boost Python and Cython. For me the idea of Cython
is that your main code is in Python

Normally, yes. You can embed Cython code in C++ just like any other C code
(with the caveat of needing to make sure the Python runtime is properly set
up), but that certainly isn't the most popular use case.

but you want to improve the
performance of specific parts of the code. In that case, Cython is the
way to go. In case of Boost Python, the scenario for me is that you have
a main program/library in C++, but you want to be able use the
functionality from Python.

That's really just a slight difference. What kind of code initially started
up an application is quite irrelevant once it has been running for a while.
The distinction between embedding and extending, as the Python docs put it,
is actually quite fuzzy when it comes to the actual code interaction.

Note also that this isn't the use case here, the OP asked for wrapping a
C++ type for use in Python.

Stefan
 
E

Evan Driscoll

[Stefan gave part of an answer here, but I've got an addition too.]

I never worked with Cython (but I know it is very powerful and interesting) but in my mind there are slight differences in usage scenario between e.g. Boost Python and Cython. For me the idea of Cython is that your main code is in Python, but you want to improve the performance of specific parts of the code. In that case, Cython is the way to go. In case of Boost Python, the scenario for me is that you have a main program/library in C++, but you want to be able use the functionality from Python.

Do you agree with this view?

Sort of, but sort of not. I've only used Cython a little bit, but it
seems to work equally well if you want to write a C module for some
reason (e.g. to interface with existing C code) but don't want to deal
with the standard CPython C API directly.

For instance, I used it to wrap the OS's opendir/readdir
(FindFirstFile/FindNextFile) functions: I just wrote a bit of code using
Cython's extensions, and I get a module I can import and use as normal.
I certainly didn't do it for speed, I did it because it seemed like a
reasonable way to get access to those APIs. (ctypes was insufficient for
my needs.)

So wrapping a C++ class using Cython also seems pretty natural to me,
assuming that Cython does OK with C++ and isn't restricted to C (which I
have no idea about).

Evan
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,236
Members
46,822
Latest member
israfaceZa

Latest Threads

Top