Providing a Python wrapper to a C++ type.

Discussion in 'Python' started by aaron.l.france@gmail.com, Oct 16, 2012.

  1. Guest

    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
     
    , Oct 16, 2012
    #1
    1. Advertising

  2. Marco Nawijn Guest

    On Tuesday, October 16, 2012 10:11:52 AM UTC+2, wrote:
    > 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
     
    Marco Nawijn, Oct 16, 2012
    #2
    1. Advertising

  3. Marco Nawijn, 16.10.2012 12:17:
    > On Tuesday, October 16, 2012 10:11:52 AM UTC+2, wrote:
    >> 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

    >
    > 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
     
    Stefan Behnel, Oct 16, 2012
    #3
  4. Marco Nawijn Guest

    On Tuesday, October 16, 2012 1:39:44 PM UTC+2, Stefan Behnel wrote:
    > Marco Nawijn, 16.10.2012 12:17:
    >
    > > On Tuesday, October 16, 2012 10:11:52 AM UTC+2, wrote:

    >
    > >> 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 concretelyhow

    >
    > >> one would include an interface to a type.

    >
    > >>

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

    >
    > >

    >
    > > 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 prettywell 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


    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
     
    Marco Nawijn, Oct 16, 2012
    #4
  5. Marco Nawijn Guest

    On Tuesday, October 16, 2012 1:39:44 PM UTC+2, Stefan Behnel wrote:
    > Marco Nawijn, 16.10.2012 12:17:
    >
    > > On Tuesday, October 16, 2012 10:11:52 AM UTC+2, wrote:

    >
    > >> 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 concretelyhow

    >
    > >> one would include an interface to a type.

    >
    > >>

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

    >
    > >

    >
    > > 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 prettywell 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


    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
     
    Marco Nawijn, Oct 16, 2012
    #5
  6. 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
     
    Stefan Behnel, Oct 16, 2012
    #6
  7. Re: Re: Providing a Python wrapper to a C++ type.

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

    On 10/16/2012 6:46 AM, Marco Nawijn wrote:
    > 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
     
    Evan Driscoll, Oct 16, 2012
    #7
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Jay Douglas

    Providing a live webcam to the website

    Jay Douglas, Jul 26, 2004, in forum: ASP .Net
    Replies:
    3
    Views:
    5,820
    John Timney \(Microsoft MVP\)
    Jul 28, 2004
  2. =?Utf-8?B?ZG90bmV0dGVzdGVy?=

    providing search capabilities

    =?Utf-8?B?ZG90bmV0dGVzdGVy?=, Sep 15, 2005, in forum: ASP .Net
    Replies:
    3
    Views:
    384
    Bruce Barker
    Sep 15, 2005
  3. Lee
    Replies:
    0
    Views:
    385
  4. Hoegje
    Replies:
    2
    Views:
    22,601
    Gianni Mariani
    Dec 5, 2003
  5. Adam Atlas
    Replies:
    5
    Views:
    294
    Adam Atlas
    Mar 27, 2007
Loading...

Share This Page