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代码.
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