Boost Python 使用回调函数

2024-09-28 03:12:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样的头文件(fingisdk.h):

#ifndef FINGISDK_H_
#define FINGISDK_H_

#include "fingienum.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef void (*fingi_event)(FINGI_EVENT_ID eventId, char* msg);

FINGI_EVENT_ID start_fingi_sdk(char* ini_file_location);
FINGI_EVENT_ID download_room_info(char** roominfo);

void register_fingi_sdk_status_event_listener(fingi_event pointer_to_listener_fnc);


#ifdef __cplusplus
}
#endif
#endif

然后我为这个编写了一个python包装器:

^{pr2}$

调用它的python文件如下:

import libpythonWrapper

print libpythonWrapper.start_fingi_sdk('file_location.ini')

到目前为止,这个还不错。但是,我不知道如何暴露双指针 功能:

FINGI_EVENT_ID download_room_info(char** roominfo);

和回调函数:

void register_fingi_sdk_status_event_listener(fingi_event pointer_to_listener_fnc);

有人能给我指一些文件或帮助我解决它吗

谢谢


编辑1:

经过一番折腾,我想出了如何实现指针到指针的函数。Python不支持指针,因此必须包装下载的\u room_info(char**roominfo)以返回简单字符串:

std::string download_room_info_python_wrapper() {
    char * value;
    FINGI_EVENT_ID result = download_room_info(&value);
    return std::string(value);
}

然后:

def("download_room_info", download_room_info_python_wrapper);

仍在寻找回调函数的解决方案


Tags: infoeventiddownloadsdkplusroomendif
1条回答
网友
1楼 · 发布于 2024-09-28 03:12:53

因此,您希望将此API绑定到Python:

typedef void (*fingi_event)(FINGI_EVENT_ID eventId, char* msg);
void register_fingi_sdk_status_event_listener(fingi_event);

这是一个register函数,它接受一个eventId和一个字符串的函数。好,让我们定义一个我们自己的(当然,在外部“C”中,就像API一样):

^{pr2}$

现在我们可以为register函数编写一个包装器:

void my_register()
{
  register_fingi_sdk_status_event_listener(my_callback);
}

把它绑起来:

def("my_register", my_register);

这应该都管用。但这没用,因为我们实际上在回调中什么都没做。所以这就引出了一个子问题,那就是如何在回调中做任何事情?我的一个想法是,您应该建立自己的函数注册机制,该机制允许您将Python回调函数注册到全局PyObject中,该对象将被设置为Python函数并使用Boost Python调用:

boost::python::object g_callback;
void my_callback(FINGI_EVENT_ID eventId, char* msg)
{
  if (g_callback)
    g_callback(eventId, msg);
}

现在只需要让用户分配全局回调:

void set_callback(boost::python::object func)
{
  g_callback = func;
  register_fingi_sdk_status_event_listener(my_callback);
}

def("set_callback", set_callback);

然后在Python中:

def callback(eventId, msg):
  print eventId, msg

set_callback(callback)

我想应该就是这样了。如果您的回调API像许多回调API一样支持“void*userData”参数,那么整个事情就会简单得多。然后我们用它来存储PyObject或其他有用的东西。但是API缺少这一点,所以我们需要一个全局的地方来记住调用哪个函数。在

相关问题 更多 >

    热门问题