我正在用C暴露一组数据中的PyMemoryView,如下所示:
PyMemoryView_FromMemory((char *)ibuf->rect, pixels * sizeof(uint), PyBUF_WRITE);
但是,该数据是浮点数据,因此尝试执行此操作:
mv = get_my_memory_view()
mv[0] = 3.141
产生以下错误:
TypeError:memoryview:格式“ B”的无效类型
这当然是因为memoryview假定基础数据是字节数据,而不是浮点数。我如何确保从模块返回的memoryview具有浮点说明符?
答案 0 :(得分:1)
最简单的方法可能是使用the cast
method of the memoryview获取具有正确格式的新memoryview。没有直接的C-API方法可以执行此操作,因此只需像其他任何Python方法一样调用它即可:
mview_double = PyObject_CallMethod(mview_bytes, "cast", "s", "d");
这假设double
数据-如果它是float
数据,则应更改"d"
。
在最初对PyMemoryView_FromMemory
的调用中,我认为pixels * sizeof(uint)
是错误的,因为您已经告诉我们数据类型是浮点类型。也许pixels*sizeof(ibuf->rect[0])
?