Function References

Diez B. Roggisch deets at nospam.web.de
Thu Jul 31 15:59:56 CEST 2008


squishywaffle at gmail.com wrote:

> Greetings,
> 
> I'm trying to wrap a function in a C library as a compiled C Python
> module. Everything is going great, but I've hit a snag. There's a
> function in the form of this:
> 
> First the typedef:
> typedef void(*FPtr_DeviceMessageHandler) (const DeviceMessage, const
> char*);
> 
> Then the actual function prototype:
> FPtr_DeviceMessageHandler
> RegisterDeviceMessageHandler(FPtr_DeviceMessageHandler);
> 
> Whenever this USB device I'm using generates a message, it's then sent
> to that function whose reference you passed to
> RegisterDeviceMessageHandler(). Here's an example:
> 
> void testfunc() {
>   printf("test");
> }
> ...on to main()
> RegisterDeviceMessageHandler(&testfunc)
> 
> So I've defined a similar function on my C module to do just this,
> using the passed function reference to allow the device to send
> messages to a Python function of the user's choice. I'm just not sure
> how to do this, and the tutorials I've been digging through don't
> offer any help. I've found some functions that look promising, but
> can't figure out how to cast the function reference from Python into
> something the C RegisterDevice... function can handle. Here's what
> I've got:
> 
> static PyObject *
> Py1_RegisterDeviceMessageHandler(PyObject *self, PyObject *args)
> {
>     PyObject *handle, *parsed;
> 
>     if(!PyArg_ParseTuple(args, "O", handle)) {
>         return NULL;
>     }
> 
>     parsed = PyMethod_Function(handle);
>     I1_RegisterDeviceMessageHandler(PyMethod_Function(handle));
> 
>     Py_RETURN_TRUE;
> } // end Py1_RegisterDeviceMessageHandler()
> 
> This fails since  PyMethod_Function returns a PyObject. Is there a way
> to cast this to something generic? Casting to (void*) didn't seem to
> work.
> 
> Thanks in advance!

May I suggest you move to ctypes for wrapping? It's easier, pure python and
callbacks are already built-in.

Diez



More information about the Python-list mailing list