我有一个python memoryview
指向我想在cython中执行一些处理的bytes
对象。
我的问题是:
bytes
对象不可写,cython 不允许从中构造类型化(cython)内存 View 示例:
在 python 中:
array = memoryview(b'abcdef')[3:]
在cython中:
cdef char * my_ptr = &array[0]
无法编译并显示以下消息:Cannot take address of Python variable
cdef char[:] my_view = array
在运行时失败并显示消息:BufferError: memoryview: underlying buffer is not writable
怎么解决这个问题?
最佳答案
好的,在深入研究python api之后,我找到了一个解决方案,该解决方案可以在memoryview(此处称为bytes
)中获取指向bytes_view = memoryview(bytes())
对象缓冲区的指针。也许这对其他人有帮助:
from cpython.buffer cimport PyObject_GetBuffer, PyBuffer_Release, PyBUF_ANY_CONTIGUOUS, PyBUF_SIMPLE
cdef Py_buffer buffer
cdef char * my_ptr
PyObject_GetBuffer(bytes, &buffer, PyBUF_SIMPLE | PyBUF_ANY_CONTIGUOUS)
try:
my_ptr = <char *>buffer.buf
# use my_ptr
finally:
PyBuffer_Release(&buffer)