SWIG 将参数传递给 python 回调函数 [英] SWIG passing argument to python callback function
问题描述
所以我快完成了.现在我有调用 python 回调函数的工作代码.
So I'm almost done. Now I have working code which calls python callback function.
我现在唯一需要的是如何将参数传递给 python 回调函数.
Only thing I need now is how to pass argument to the python callback function.
我的 callback.c 是:
My callback.c is:
#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
");
if (my_callback) (*my_callback)();
else printf("No callback registered
");
}
我的 callback.i 是:
My callback.i is:
// 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
?任何帮助将不胜感激!
It works well. What should I do so I can pass argument to my_callback
?
Any help will be greatly appreciated!
推荐答案
回调的参数是 PyEval_CallObject()
的第二个参数.现在您正在构建一个空元组,这意味着没有参数".所以,改变它.你现在做什么:
The arguments to the callback are the second argument to PyEval_CallObject()
. Right now you're building an empty tuple, which means "no arguments". So, change that. Where you now do:
arglist = Py_BuildValue("()"); /* No arguments needed */
您改为传递 Py_BuildValue
您希望 Python 函数接收的任何参数.例如,如果你想向回调传递一个整数、一个字符串和一个你从某个地方得到的 Python 对象,你可以这样做:
you instead pass Py_BuildValue
whatever arguments you want the Python function to receive. For example, if you want to pass the callback an integer, a string and a Python object you got from somewhere, you would do:
arglist = Py_BuildValue("(isO)", the_int, the_str, the_pyobject);
这篇关于SWIG 将参数传递给 python 回调函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!