2010-10-01 16 views
5

पर SWIG उत्तीर्ण तर्क तो मैं लगभग पूरा कर चुका हूं। अब मेरे पास काम करने वाला कोड है जो पायथन कॉलबैक फ़ंक्शन को कॉल करता है।पाइथन कॉलबैक फ़ंक्शन

केवल मुझे जो चीज चाहिए वह है कि पाइथन कॉलबैक फ़ंक्शन पर तर्क कैसे पारित किया जाए।

मेरे 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 */ 

आप के बजाय Py_BuildValue जो कुछ भी तर्क आप अजगर समारोह प्राप्त करना चाहते हैं गुजरती हैं। उदाहरण के लिए, यदि आप कॉलबैक एक पूर्णांक, एक स्ट्रिंग और एक अजगर वस्तु आप कहीं से मिला पास करना चाहते हैं, आप क्या करेंगे:

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

मैं अपने उदाहरण में the_int के लिए परिभाषाएँ, the_str और the_pyobject शामिल नहीं किया। वे चीज़ें * आप * पास करना चाहते हैं। यह एक उदाहरण है। –

+0

ओह .. मुझे स्थिर शून्य पायथन कैलबैक (char * the_str) भी बनाना होगा। इसने काम कर दिया! आपको बहुत - बहुत धन्यवाद! – joon

संबंधित मुद्दे