创建具有特定格式的 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])
?
我正在用 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])
?