我想在用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)有部分*回調*可能有用。 –