SWIG将参数传递给Python回调函数
我快完成了。现在我有了可以调用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
传递参数呢?非常感谢任何帮助!
1 个回答
3
回调函数的参数是PyEval_CallObject()
的第二个参数。现在你正在创建一个空的元组,这就意味着“没有参数”。所以,你需要改一下。在你现在的代码中:
arglist = Py_BuildValue("()"); /* No arguments needed */
你应该用Py_BuildValue
来传递你希望Python函数接收的参数。例如,如果你想传递一个整数、一个字符串和一个你从某处得到的Python对象,你可以这样做:
arglist = Py_BuildValue("(isO)", the_int, the_str, the_pyobject);