SWIG传递参数给Python回调函数

5

我快完成了。现在我有一个可以调用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");
}

我的回调函数.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传递参数?任何帮助将不胜感激!

1个回答

3
回调函数的参数是传递给PyEval_CallObject()的第二个参数。目前你正在构建一个空元组,这意味着"没有参数"。所以,请进行更改。你现在所做的是:

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

您可以使用 Py_BuildValue 来传递任何您想要 Python 函数接收的参数。例如,如果您想要传递一个整数、一个字符串和一个从某处获取的 Python 对象给回调函数,您应该这样做:

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

我在我的示例中没有包含the_int、the_str和the_pyobject的定义。它们将是想要传递的内容。这只是一个示例。 - Thomas Wouters
哦..我还需要创建一个静态的void PythonCallBack(char* the_str)。它起作用了!非常感谢你! - joon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接