好吧,我已经快完成这个了,我可以尝尝它的味道了。在过去的几周左右的时间里,我一直在尝试创建一个 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”中,我收到错误:“无法将 'const_ushort *' 转换为 Python 对象”。我对此的第一次尝试是创建一个新的 python 列表,然后循环将数组的每个元素放入 python 列表中,如下所示:
datalist = []
for i in range(width*height):
datalist += data[i]
可悲的是,这让我发现编译后的 cython 代码试图将类型定义为“const const unsigned Short”,这显然是一个问题。
然后我尝试了这个:
datalist = []
for i in data:
datalist += i
这给了我“C 数组迭代需要已知的结束索引”。请注意,我对 C/C++ 知之甚少,所以其中大部分内容对我来说没有多大意义。
那么,无论如何,是否有任何有效的方法可以将这样的指针转换为 python 对象(最好比循环数组更快,因为它通常大约有 57344 个项目,而且这对时间非常敏感)
Edit:
需要更多说明,正如我提到的,我正在使用回调,并且库中调用此函数的 C++ 函数发送一个指向“const uint_16”数组的指针,这就是我以这种方式定义 const_ushort 的原因,因为否则类型不统一。我无法以任何方式修改该库。
Edit2:
看来我明白了。我最终要做的就是显式地将数组转换为无符号短裤数组,而不是 const 无符号短裤数组,这样我就可以用非常量对它们进行索引。为了实现这一点,我创建了另一个像这样的 C++ 函数(其他人为我编写了它,我几乎不懂 C++):
unsigned short *convert_short(const unsigned short *test){ return const_cast<unsigned short *>(test); }
这让我能够创造“getindex“在我的类中运行函数,并根据该函数返回正确的值。所以,是的,Python 似乎正确地读取了数组等等,所以这个案例似乎已经结束了。非常感谢。