gpt4 book ai didi

python - SWIG 将参数传递给 python 回调函数

转载 作者:太空狗 更新时间:2023-10-30 01:24:17 28 4
gpt4 key购买 nike

所以我快完成了。现在我有了调用 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?任何帮助将不胜感激!

最佳答案

回调的参数是 PyEval_CallObject() 的第二个参数。现在你正在构建一个空元组,这意味着“没有参数”。所以,改变它。你现在在哪里:

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

您改为传递 Py_BuildValue 您希望 Python 函数接收的任何参数。例如,如果你想向回调传递一个整数、一个字符串和一个你从某处获得的 Python 对象,你可以这样做:

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

关于python - SWIG 将参数传递给 python 回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3843064/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com