Extending Python with C or C++

Thomas Heller theller at python.net
Wed Jan 7 10:58:05 CET 2009


Nick Craig-Wood schrieb:
> Ralf Schoenian <ralf at schoenian-online.de> wrote:
>>  Ryan wrote:
>> > I've been using Python for many years now. It's a wonderful language
>> > that I enjoy using everyday. I'm now interested in getting to know
>> > more about the guts (C/C++) and extending it. But, extending python
>> > still seems like a black art to me. Is there anymore docs or info on
>> > extending it besides the standard sparse ones (http://www.python.org/
>> > doc/2.5.2/ext/intro.html) that may give me more insight? Is there a
>> > class available? How can I learn more about the guts of python? How
>> > would one go about following an interest in contributing to the
>> > development of python.
>> 
>>  It is not exactly what you are looking for but nevertheless I am 
>>  thinking the  article "Automatic C Library Wrapping -- Ctypes from the 
>>  Trenches" may be interesting for you. You can find it in the latest 
>>  Python Papers issue or simply following the link: 
>>  http://ojs.pythonpapers.org/index.php/tpp/article/view/71
> 
> Interesting - I didn't know about h2xml and xml2py before and I've
> done lots of ctypes wrapping!  Something to help with the initial
> drudge work of converting the structures would be very helpful.
> 
> ( http://pypi.python.org/pypi/ctypeslib/ )
> 
> I gave it a quick go and it worked fine.  I had to edit the XML in one
> place to make it acceptable (removing a u from a hex number).  The
> output of xml2py was an excellent place to start for the conversion,
> though I don't think I'd want to use an automated process like in the
> paper above as its output needed tweaking.
> 
> ...

If you are using a recent version of gccxml, then you should use the
ctypeslib-gccxml-0.9 branch of ctypeslib instead of the trunk. (I should
really merge the gccxml-0.9 branch into the trunk;-)

If you are already using the branch and the XML file is not accepted,
then could you please provide a short C code snippet that reproduces
the problem so that I can fix it?


> Here are my thoughts on the conversion :-
> 
> It converted an interface which looked like this (the inotify interface)
> 
>     struct inotify_event {
>         int      wd;       /* Watch descriptor */
>         uint32_t mask;     /* Mask of events */
>         uint32_t cookie;   /* Unique cookie associating related
>                               events (for rename(2)) */
>         uint32_t len;      /* Size of name field */
>         char     name[];   /* Optional null-terminated name */
>     };
> 
> Into this
> 
>     class inotify_event(Structure):
>         pass
>     inotify_event._fields_ = [
>         ('wd', c_int),
>         ('mask', uint32_t),
>         ('cookie', uint32_t),
>         ('len', uint32_t),
>         ('name', c_char * 0),
>     ]
> 
> Which is a very good start.  However it defined these which clearly
> aren't portable
> 
>     int32_t = c_int
>     uint32_t = c_uint
> 
> Whereas it should have been using the ctypes inbuilt types
> 
>     c_int32
>     c_uint32

IMO this would be difficult to achive automatically.  There are cases
wher c_int is the correct type, in other cases c_int32 is correct.

> Also I don't think c_char * 0 does anything sensible in ctypes,
> c_byte * 0 is what is required plus a bit of casting.  This is a
> non-standard GNU extension to C though.
> 
> All that said though, it looks like a great time saver.
> 

Thanks,
Thomas



More information about the Python-list mailing list