【发布时间】:2026-01-09 18:50:01
【问题描述】:
假设我在外部库中有以下函数:
void foo(const unsigned char *buf, const int len);
我希望能够使用 ctypes 从我的 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: 参数 1: : 错误类型
我有没有办法让bytearray 被传递,最好与bytes 互换?
【问题讨论】:
-
@eryksun 感谢您的回复。我并不真正关心这是如何实现的。我只想让外部代码在不复制缓冲区内容的情况下接收
const unsigned char*。如果可能的话。
标签: python python-2.7 ctypes