创建具有特定格式的 PyMemoryView

Creating a PyMemoryView with a specific format

我正在用 C 语言在一组数据上公开 PyMemoryView,如下所示:

PyMemoryView_FromMemory((char *)ibuf->rect, pixels * sizeof(uint), PyBUF_WRITE);

然而,该数据是浮点数据,因此尝试这样做:

mv = get_my_memory_view()
mv[0] = 3.141

产生以下错误:

TypeError: memoryview: invalid type for format 'B'

当然,这是因为 memoryview 假设底层数据是字节数据,而不是浮点数。我如何确保从我的模块返回的 memoryview 有一个 float 说明符?

最简单的方法可能是使用 the cast method of the 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])?