我一直在使用Cython嘗試與用C++編寫的庫進行接口。到目前爲止,事情都非常好,我可以有效地使用庫中的MOST函數。我唯一的問題在於實現回調。圖書館有一個看起來有點像這樣4個函數定義:Cython - 實現回調
typedef void (*Function1)(const uint16_t *data,
unsigned width, unsigned height);
void SetCallBack(Function1);
因此,要實現他們,我想我會做這樣的事情與用Cython:
ctypedef void (*Function1)(unsigned short *data,
unsigned width, unsigned height);
cdef extern from "lib.hpp":
void SetCallBack(Function1)
裏面居然編譯正確,但是,我不能爲了我的生活而思考如何以回調的方式真正實現它。我第一次嘗試創建只需調用,類似於你會怎麼做它的其他功能,想出這樣的功能:
def PySetCallBack(Func):
SetCallBack(Func)
但給我的(預測的)錯誤:
「無法將Python對象轉換爲'Function1'」
所以是的,那就是我所在的位置。如果任何人有任何在Cython中設置回調的經驗,我將非常感謝任何幫助。謝謝。
編輯: 按照你的意見,我創建了一個帶有CDEF中間的功能,它看起來像這樣:
cdef void cSetCallBack(Function1 function):
SetCallBack(function)
這似乎已經得到了我......更緊密?得到一個不同的錯誤,現在至少:
error: invalid conversion from ‘void (*)(short unsigned int*, unsigned int, unsigned int)’ to ‘void (*)(const uint16_t*, unsigned int, unsigned int)’
現在,據我可以告訴這些類型是相同的,所以我想不通這是怎麼回事。
EDIT2:
ctypedef unsigned short uint16_t
,並將它作爲參數調用,但顯然這實際上並沒有得到任何接近,但只是把我身邊: 通過宣佈新的typedef修正問題一個側軌,因爲當試圖調用該函數時,我得到了相同的「無法將Python對象重新轉換爲'Function1''錯誤。
所以,我幾乎回到了我開始的地方。我現在唯一能做的事情就是明確地將python對象作爲c函數進行轉換,但是,說實話,我不知道該如何去做。
編輯第三: 好吧,解剖你的答案後,我終於得到它,和它的作品,所以萬歲和諸如此類的東西。我落得這樣做創建這樣的功能:所以現在
cdef void cSetCallback(Function1 function):
SetCallback(function)
cdef void callcallback(const_ushort *data, unsigned width, unsigned height):
global callbackfunc
callbackfunc(data,width,height)
cSetCallback(callcallback)
def PySetCallback(callbackFunc):
global callbackfunc
callbackfunc = callbackFunc
唯一的問題是,它不能const_ushort *數據轉換成Python對象,但是這完全是另外一個問題,所以我想這一個解決了,非常感謝。
將'short unsigned int *'更改爲'const short unsigned int *'。 – aschepler 2011-03-09 23:39:42
據我所知,Cython不知道const是什麼意思,並且每當我嘗試使用它時,我都會得到「Const不是類型標識符」。 – Josiah 2011-03-10 02:05:17