Python Callbacks in C/C++ registrieren

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Krauzi
User
Beiträge: 77
Registriert: Montag 22. Oktober 2007, 18:06
Kontaktdaten:

Hi Leute, ich habe eine dll welche ein embedded python startet. Es wird ein modul erstellt (also ein internes) welches folgende funktion anbietet:
PyObject* registerHandler( PyObject*, PyObject* args )
{
char* handler_name;
PyObject* object;

if( !PyArg_ParseTuple(args, "sO", &handler_name, &object) )
return NULL;

register_handler_function( handler_name, (cast_object_to_funktion_ptr)object );
Py_RETURN_NONE;
}

diese wird dann so aufgerufen (in python):
from ctypes import *
registerHandler( "HandlerName", CFUNCTYPE(None, c_void_p)(test_func1) )

Die Frage ist jetzt: welchen cast muss ich auf object anwenden, damit ich die c-wrapper funktion des objects bekomme?
BlackJack

@Krauzi: Einen *cast* wird es da nicht geben, denn das ist ja eine `PyObject`-Datenstruktur. Vielleicht könntest Du Dir eine Adresse mit `ctypes.adressof()` geben lassen!?
Krauzi
User
Beiträge: 77
Registriert: Montag 22. Oktober 2007, 18:06
Kontaktdaten:

klappt leider auch nicht. Aber die funktion muss ja irgendwo in dem PyObject ptr gespeichert sein, also müsste ich doch irgendwie an den funktions pointer rankommen.
Ich hab schon ein bisschen in der source geguckt, jedoch finde ich keinen funktionierenden zeiger.

EDIT: wuut: Die Lösung liegt eigentlich auf der hand (wenn man in python denkt, nicht aber in c++ [was ich gewohnt bin]), ein *cast* funktioniert anscheinend doch ;) :
Ein cast(func_wrapped, c_void_p).value liefert die exacte addresse der c wrapper funktion :)

Der Code nochmal funktionierend:
registerHandler( "HandlerName", cast(CFUNCTYPE(None, c_void_p)(test_func1), c_void_p).value )
Antworten