내가 외부 라이브러리에 다음 함수가 있다고 가정 :ctypes를 사용하여 바이트 및 바이트 객체를 모두 외부 라이브러리로 효율적으로 전달할 수 있습니까?
void foo(const unsigned char *buf, const int len);
내가 버퍼의 복사본을 만들지 않고,
ctypes
를 사용하여 내 파이썬 코드에서이 함수를 호출 할 수 있도록하고 싶습니다
. 버퍼가 상당히 클 수 있으므로 사본을 피하는 것이 명백한 성능 이점을 갖습니다. 그리고 내 코드의 소비자의 편의를 위해이 버퍼를 bytes
또는 bytearray
으로 제공 할 수 있기를 바랍니다.
지금 으로 buf
을 선언합니다. 내 argtypes
선언에.
lib.foo.argtypes = [ctypes.POINTER(ctypes.c_char), ctypes.c_int]
buf = bytes(...)
lib.foo(buf, len(buf))
잘 작동하며 bytes
개체를 전달할 수 있습니다. 나는 다음 bytearray
개체를 전달할 경우, 나는 다음과 같은 오류가 발생 :
ctypes.ArgumentError: argument 1: : wrong type
bytearray
가 bytes
, 바람직 상호 교환, 전달 될 수 있도록 저를위한 방법이 있나요?
@eryksun 응답 해 주셔서 감사합니다. 나는 이것이 어떻게 성취되었는지에 대한 진실한 염려가 없다. 방금 외부 코드가 버퍼 내용을 복사하지 않고'const unsigned char * '를 받길 원합니다. 가능하다면. –