我想在用C++编写的DLL中注册一个用于回调的Python函数,我无法弄清楚如何去做。Cython:在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对象不能转换为基本类型的指针
我也试过& FUNC并且得到错误消息:无法获取Python变量的地址。
将此Python函数作为指向我的C代码的正确方法是什么?
更新:我应该提到我的这个Python函数的预期目的。 Python应用程序使用PyQt编写,该函数将发出一个信号。 DLL本身没有Qt的知识,并且没有Qt库编译。 DLL中的一个方法会间接调用这个函数,它会向Python应用程序发出一个信号。
我相信你的问题是,你的回调函数原型C不匹配的Python风格的函数原型(其中有一个的argc/argv的类似机构)。我从来没有使用过cython,我总是直接连接到python库。 – zmo
如果你真的想将一个任意的python callable转换为一个c函数指针,那么你不能在Cython中完成它(但你可以使用ctypes/cffi)。如果你想使用一个特定的函数,那么在Cython中创建cdef/cpdef。 – DavidW
文档[使用C库](http://docs.cython.org/src/tutorial/clibraries.html)有部分*回调*可能有用。 –