SWIG pasando el argumento a la función de callback de Python

Ya casi termino. Ahora tengo un código de trabajo que llama a la función de callback de Python.

Lo único que necesito ahora es cómo pasar el argumento a la función de callback de python.

Mi callback.c es:

#include  typedef void (*CALLBACK)(void); CALLBACK my_callback = 0; void set_callback(CALLBACK c); void test(void); void set_callback(CALLBACK c) { my_callback = c; } void test(void) { printf("Testing the callback function\n"); if (my_callback) (*my_callback)(); else printf("No callback registered\n"); } 

Mi callback.i es:

 // An entirely different mechanism for handling a callback %module callback %{ typedef void (*CALLBACK)(void); extern CALLBACK my_callback; extern void set_callback(CALLBACK c); extern void my_set_callback(PyObject *PyFunc); extern void test(void); %} extern CALLBACK my_callback; extern void set_callback(CALLBACK c); extern void my_set_callback(PyObject *PyFunc); extern void test(void); %{ static PyObject *my_pycallback = NULL; static void PythonCallBack(void) { PyObject *func, *arglist; PyObject *result; func = my_pycallback; /* This is the function .... */ arglist = Py_BuildValue("()"); /* No arguments needed */ result = PyEval_CallObject(func, arglist); Py_DECREF(arglist); Py_XDECREF(result); return /*void*/; } void my_set_callback(PyObject *PyFunc) { Py_XDECREF(my_pycallback); /* Dispose of previous callback */ Py_XINCREF(PyFunc); /* Add a reference to new callback */ my_pycallback = PyFunc; /* Remember new callback */ set_callback(PythonCallBack); } %} %typemap(python, in) PyObject *PyFunc { if (!PyCallable_Check($input)) { PyErr_SetString(PyExc_TypeError, "Need a callable object!"); return NULL; } $1 = $input; } 

Funciona bien. ¿Qué debo hacer para pasar el argumento a my_callback ? ¡Cualquier ayuda será apreciada!

    Los argumentos de la callback son el segundo argumento de PyEval_CallObject() . Ahora mismo estás construyendo una tupla vacía, que significa “sin argumentos”. Entonces, cambia eso. Donde ahora haces

     arglist = Py_BuildValue("()"); /* No arguments needed */ 

    en su lugar, pasa Py_BuildValue argumentos que deseas que reciba la función Python. Por ejemplo, si quiere pasar la callback a un entero, una cadena y un objeto Python que obtuvo de algún lugar, haría:

     arglist = Py_BuildValue("(isO)", the_int, the_str, the_pyobject);