好吧,我快吃完了,我能尝到。在过去的几周里,我一直试图创建一个Python扩展,与Cython通过C++编写的库接口。在这里的人和几个朋友的帮助下,我已经成功地达到了98%的效果。唯一剩下的就是:我一辈子都不知道如何将指向无符号短数组的指针转换成python对象(最好是一个列表)。在

有点背景,我正在尝试与设置回调函数的库的一部分接口,我已经成功地完成了以下操作:global callbackfunc

ctypedef unsigned short const_ushort "const uint16_t"
ctypedef void (*Function1)(const_ushort *data, unsigned width, unsigned height)
cdef extern from "lib.hpp":
void SetCallback(Function1)
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

这个问题发生在函数“callcallback”中,我得到错误消息:“Cannot convert'const'ushort*'to Python object”。我对此的第一次尝试是创建一个新的python列表,并通过循环将数组的每个元素放入python列表中,如下所示:

^{pr2}$

不幸的是,它用编译过的cython代码把一个类型定义为“const const unsigned short”,这显然是个问题。在

然后我试了一下:

datalist = []
for i in data:
datalist += i

这给了我“C数组迭代需要已知的结束索引”。注意,我知道的很少C/C++,所以大部分对我没有多大意义。在

那么,不管怎样,有没有什么有效的方法可以将这样的指针转换成python对象(最好比遍历数组更快,因为它通常大约有57344个项,这对时间非常敏感)

编辑:

稍稍澄清一下,正如我提到的,我正在使用回调函数,调用库的C++函数发送指向“const uutn16”s的数组的指针,这就是为什么我定义了conTrasuSuthSug的原因,因为否则这些类型不统一。我不能以任何方式修改库。在

编辑2:

看来我明白了。最后我要做的是显式地将数组转换为无符号短数组,而不是一个const unsigned shorts数组,这样我就可以用一个非常数来索引它们。为了实现这个目标,我创建了另一个C++函数,像这样(别人为我写的,我几乎不知道C++):unsigned short *convert_short(const unsigned short *test){ return const_cast(test); }

这使我能够在类中创建“getindex”函数,并根据函数返回正确的值。所以是的,Python似乎正确地读取了数组等等,所以这个案子似乎已经结束了。