Cython:为DLL中的回调注册Python函数

时间:2016-03-08 18:32:27

标签: python c++ cython

我试图在用C ++编写的DLL中注册Python函数进行回调,但我无法弄清楚如何去做。

我的C ++代码标题如下:

extern "C" {
    __declspec(dllexport) void RegisterFunc((void (*)());
 }

实施是:

void (*funcCallback)() = NULL;
__declspec(dllimport) void RegisterFunc(void(*func)())
{
    funcCallback = func;
}

我的Cython pyx文件如下:

cdef extern void RegisterFunc(void (*)())

def PyRegisterFunc(func):
    RegisterFunc(func)

编译时会显示错误消息: 无法将Python对象转换为' void(*)(void)'

如果我将代码更改为:

def PyRegisterFunc(func):
    RegisterFunc(<void (*)()>func)

我收到错误消息: Python对象不能转换为基本类型的指针

我还尝试了&amp; func并收到错误消息:无法获取Python变量的地址。

将此Python函数作为指向C代码的指针传递的正确方法是什么?

更新:我应该提到这个Python函数的预期目的。 Python应用程序是用PyQt编写的,函数会发出一个信号。 DLL本身不知道Qt,并且在没有Qt库的情况下编译。 DLL中的方法将间接调用此函数,该函数将向Python应用程序发出信号。

1 个答案:

答案 0 :(得分:-1)

参见Cython docs:Here's an example