我一直在使用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