好吧,我非常接近完成这个我可以品尝它.在过去几周左右的时间里,我一直在尝试创建一个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
Run Code Online (Sandbox Code Playgroud)
问题出现在函数"callcallback"中,我得到错误:"无法将'const_ushort*'转换为Python对象".我第一次尝试这个是创建一个新的python列表,并循环以将数组的每个元素放入python列表,如下所示:
datalist = []
for i in range(width*height):
datalist += data[i]
Run Code Online (Sandbox Code Playgroud)
遗憾的是,在编译的cython代码中,我试图将类型定义为"const const unsigned short",这显然是一个问题.
然后我尝试了这个:
datalist = []
for i in data:
datalist += i
Run Code Online (Sandbox Code Playgroud)
这让我"C数组迭代需要已知的结束索引".请注意,我对C/C++知之甚少,所以大部分内容对我来说都没有多大意义.
所以,无论如何,是否有任何有效的方法将这样的指针转换为python对象(最好比循环遍历数组更快,因为它通常约为57344项,这对时间非常敏感)
编辑:稍微澄清一下,正如我所提到的,我正在使用回调,并且调用它的库中的C++函数会发送一个指向"const uint_16"数组的指针,这就是我用这种方式定义const_ushort的原因,因为否则类型不统一.我无法以任何方式修改库.
Edit2:看起来我明白了.我最终要做的是显式地将数组转换为无符号短路数组,而不是const无符号短路数组,我可以用非常数索引它们.为了实现这一点,我创建了另一个这样的C++函数(别人为我编写了它,我几乎不知道C++):
unsigned short *convert_short(const unsigned short *test){ return const_cast<unsigned short *>(test); }
Run Code Online (Sandbox Code Playgroud)
这允许我在我的类中创建" getindex "函数并根据函数返回正确的值.所以是的,Python似乎正在正确读取数组,所以这个案例似乎已经关闭了.非常感谢.
ctypedef unsigned short const_ushort "const uint16_t"
Run Code Online (Sandbox Code Playgroud)
使const出现在 C 代码中,因此您会发现typedef unsigned short const uint16_t其中const毫无意义。(它还重新定义了标准类型uint16_t,这是不应该的。)
您可能会取得更大的成功
ctypedef unsigned short *ushort_p "ushort_p"
Run Code Online (Sandbox Code Playgroud)
由于某种原因,Cython 似乎无法识别 Cconst关键字。您可能必须使用回调包装器来处理该const问题。
如果您希望将指针转换为 Python 对象,请将其包装在cdef class. 确保类记录高度和宽度,因为这些不是用 C 数组记录的。
| 归档时间: |
|
| 查看次数: |
4047 次 |
| 最近记录: |