Python code -> to C code
Thomas Heller
theller at python.net
Wed Apr 30 07:35:36 EDT 2003
Duncan Booth <duncan at NOSPAMrcp.co.uk> writes:
> Thomas Heller <theller at python.net> wrote in news:bryo1gj6.fsf at python.net:
>
> > Normally this is used to implement "callback functions" in Python, to
> > call functions like Windows' EnumWindows(), or to implement COM object
> > method tables.
> >
> > Does this count as embedding? It seems so, although I have never seen it
> > this way.
>
> I think it counts as half of embedding. It lets you call Python from C,
> provided the C was called originally from Python. I don't see that it helps
> at all with the situation in my original posting which was calling Python
> from an otherwise purely C program.
>
> I'm impressed by the example wrapping qsort.
;-)
> I can't think offhand of a way to achieve this easily in Pyrex. That
> is, Pyrex could easily wrap qsort to call a specific Python function
> for the comparison, but there isn't anywhere in the qsort callback to
> store state, and I can't see how you manage to convert a Python
> function into a C level function without some additional state.
Right. Actually ctypes is creating C functions at runtime. If you're
interested, the source is here:
http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/ctypes/ctypes/source/callbacks.c?rev=HEAD&content-type=text/vnd.viewcvs-markup
There is additional state. On Windows, the function AllocCallback() does
the trick. It uses CallbackTemplate(), which is a small inline
assembler function template, which is copied into malloc'ed memory, and
then some dwords are filled out with the required state. This includes a
pointer to the Python callable.
For other systems, libffi does the trick.
Thomas
More information about the Python-list
mailing list