获取指向bytes obj上python memoryview的指针

2024-10-01 22:32:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pythonmemoryview指向一个bytes对象,我想用cython对其执行一些处理。在

我的问题是:

  • 因为bytes对象不可写,cython不允许从它构造类型化(cython)memoryview
  • 我也不能使用指针,因为我无法获取指向memoryview开始的指针

示例:

在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

如何解决这个问题?在


Tags: 对象消息示例bytesmyarraycython指向
3条回答

可以使用bytearray创建可变内存视图。请注意,这不会更改字符串,只更改bytearray

data = bytearray('python')
view = memoryview(data)
view[0] = 'c'
print data
# cython

使用bytearray(根据@CheeseLover的回答)可能是正确的做法。我的建议是完全在bytearrays中工作,从而避免临时转换。但是:

^{} can be directly created from a Python string(或bytes)-参见链接部分的末尾:

cdef char * my_ptr = array
# you can then convert to a memoryview as normal in Cython
cdef char[:] mview = <char[:len(array)]>my_ptr

一些警告:

  1. 请记住,bytes是不可变的,如果试图修改该memoryview很可能会导致问题
  2. my_ptr(因此mview)只有在{}有效的情况下才有效,因此只要您需要访问数据,请务必保留对{}的引用

好的,在研究了pythonapi之后,我找到了一个解决方案,可以在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)

相关问题 更多 >

    热门问题