문제

편집 : 원래 질문을 다시 읽었을 때 나는 그것이 매우 잘못된 말, 모호하며, 너무 혼란 스러웠다는 것을 매우 빨리 깨달았습니다. 그것이 점심 시간이 끝날 때 질문을 서두르기 위해 얻는 것입니다. 바라건대 이것은 더 명확해질 것입니다 :

간단한 C 구조를 Python (3.x)에 Pybuffer로 노출 시키려고하여 MemoryView를 검색 할 수 있습니다. 노출하려는 구조는 다음과 비슷합니다.

struct ImageBuffer {
    void* bytes;
    int row_count;
    int bytes_per_row;
};

그리고 스크립트 라이터가 다음과 같은 데이터에 액세스 할 수 있도록하는 것이 저의 소망입니다.

img_buffer = img.get_buffer()
img_buffer[1::4] = 255 # Set every Red component to full intensity

불행히도 이러한 구조에 대한 C API에 대한 기존 문서는 꽤 드문 드문이며, 장소에서 자립적이며, 다른 사람의 명백한 잘못 (문서화 된 기능 서명은 헤더의 서명 등과 일치하지 않습니다). 이것을 가장 잘 노출시키는 방법에 대한 아이디어. 또한 핵심 LIB의 일부가되어야하는 기능을 달성하기 위해 타사 LIBS를 포함시키지 않으려 고하지만 Pybuffer 기능이 여전히 상당히 미숙하고 Numpy와 같은 것이 더 나은 선택이 될 것입니다.

누구든지 이것에 대한 조언이 있습니까?

도움이 되었습니까?

해결책

확장 유형이 버퍼 프로토콜을 지원하도록 구현할 수있는 일련의 방법은 다음과 같습니다. http://docs.python.org/3.1/c-api/typeobj.html#buffer-object-structure

문서가 꽤 거칠다는 것을 알고 있으므로 공식 Python 소스 코드에서 BytesObject.c 또는 bytearrayobject.c와 같은 C 유형의 기존 버퍼 API 구현에서 시작하는 것입니다.

그러나 버퍼 프로토콜은 인용 한 것과 같은 고급 표기법에 액세스하지 못합니다. img_buffer[1::4] = 255 MemoryView 객체에서 작동하지 않습니다.

편집하다: 보다 정확하게 말하면, MemoryViews는 어떤 종류의 슬라이스 할당을 지원하지만 이들 모두를 지원하는 것은 아닙니다. 또한 슬라이스에 255를 할당한다는 것은 실제로 바이트 값을 반복하기를 원한다는 것을 이해하기에 충분히 "똑똑하지 않습니다. 예시:

>>> b = bytearray(b"abcd")
>>> m = memoryview(b)
>>> m[0:2] = b"xy"
>>> b
bytearray(b'xycd')
>>> m[0:2] = 255
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'int' does not support the buffer interface
>>> m[0:2] = b"x"
Traceback (most recent call last):
  File "", line 1, in 
ValueError: cannot modify size of memoryview object
>>> m[0::2] = b"xy"
Traceback (most recent call last):
  File "", line 1, in 
NotImplementedError
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top