假设我有一个外部的库如下功能:是否有可能使用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 *'而不复制缓冲区的内容。如果可能的话。 –