假設我有一個外部的庫如下功能:是否有可能使用ctypes有效地將字節和bytearray對象傳遞到外部庫?
void foo(const unsigned char *buf, const int len);
我希望能夠從我的Python代碼調用這個函數,使用,未做緩衝區的副本。緩衝區可能相當大,因此避免複製具有明顯的性能優勢。爲了方便我的代碼的使用者,我希望能夠以bytes
或bytearray
的形式提供此緩衝區。
目前我在argtypes
聲明中聲明buf
爲ctypes.POINTER(ctypes.c_char)
。
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 *'而不復制緩衝區的內容。如果可能的話。 –