我有一个python memoryview指向我想在cython中执行一些处理的bytes对象。

我的问题是:

  • 因为 bytes 对象不可写,cython 不允许从中构造类型化(cython)内存 View
  • 我也不能使用指针,因为我无法获得指向 memoryview start 的指针

  • 示例:

    在 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)
    

    10-06 09:44