2010-10-01 92 views
5

所以我差不多完成了。現在我有工作代碼,它調用python回調函數。SWIG將參數傳遞給python回調函數

我現在需要的東西是如何將參數傳遞給python回調函數。

我callback.c是:

#include <stdio.h> 

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"); 
} 

我callback.i是:

// 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; 
} 

它運作良好。我該怎麼做,所以我可以將參數傳遞給my_callback? 任何幫助將不勝感激!

回答

3

該回調的參數是PyEval_CallObject()的第二個參數。現在你正在構建一個空元組,這意味着「沒有參數」。所以,改變這一點。當你現在要做的:

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

你,而不是通過你想要的Python函數接收Py_BuildValue任何參數。例如,如果你想傳遞迴調的整數,字符串,你從什麼地方得到了一個Python對象,你會怎麼做:

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

我並沒有包括在我的例子爲the_int的定義,the_str和the_pyobject。他們會是你想要通過的東西。這是一個例子。 – 2010-10-01 23:24:23

+0

哦..我需要做靜態無效PythonCallBack(char * the_str)以及。有效!非常感謝! – joon 2010-10-01 23:41:09