Python ctypes:如何修改现有的char*数组

Cad*_*yan 8 python ctypes pointers function-pointers

我正在研究一个使用libupnp的Python应用程序,它是一个C库.我正在使用CTypes来使用这个很容易的库.我遇到的问题是我正在为读取请求注册回调函数.该函数具有以下形式的原型:

int read_callback(void *pFileHandle, char *pBuf, long nBufLength);
Run Code Online (Sandbox Code Playgroud)

pFileHandle只是一些文件句柄类型.pBuf是一个可写的内存缓冲区.这是输出数据的地方.nBufLength是从文件中读取的字节数.返回状态代码.

我有一个Python函数指针.这很容易实现,但是当我定义一个Python函数来处理这个回调时,我发现pBuf没有写入,因为Python字符串是不可变的,当你分配或修改它们时,它们会创建新的实例.这带来了一个很大的问题,因为当函数完成所请求的文件数据时,C库需要返回char指针.由于Python字符串的方式,每次缓冲区最终都是空的.如果没有修改C库,有没有办法解决这个问题?

处理程序应该修改给出的缓冲区参数,这是我的问题.

所以我想要发生的是调用Python函数来执行某些文件的读取(可能在内存中,文件系统句柄或其间的任何内容).pBuf参数由读取流填充(再次在Python中).然后回调返回到写入pBuf的C代码.

Ste*_*ehl 3

ctypes 可以分配一个您的 C 库应该能够写入的缓冲区对象:

import ctypes
init_size = 256
pBuf = ctypes.create_string_buffer(init_size)
Run Code Online (Sandbox Code Playgroud)

请参阅:http ://docs.python.org/2/library/ctypes.html#ctypes.create_string_buffer

  • 内存由库分配,不应由 Python 重新分配。根据我的理解,create_string_buffer 分配新的内存。 (2认同)