将二进制数据从python 2.7导入C模块的正确方法是什么

时间:2013-02-05 21:23:53

标签: python python-2.7 python-c-extension

我正在从python中的文件中读取二进制数据并尝试将该数据发送到c模块。在python中,数据读取如此

file = open("data", "rb")
data = file.read()

我希望数据作为指向缓冲区的指针,如果可能,我希望c中的长度。我正在使用PyArg_ParseTuple来获取c模块中的参数。我注意到在python 3+中有二进制数据的y / y * / y#format说明符,但我需要在python 2.7中使用它的等效方法。

由于

1 个答案:

答案 0 :(得分:2)

您应该调查Buffer Api

来自文档:

  

对象可以使用这些函数以原始的面向字节的格式公开其数据。对象的客户端可以使用缓冲区接口直接访问对象数据,而无需先复制它。

     

支持缓冲区接口的两个对象示例是字符串和数组。字符串对象以缓冲区接口的面向字节的形式公开字符内容。数组也可以公开其内容,但应注意数组元素可能是多字节值。

例如(在C ++中):

void* ExtractBuffer(PyObject* bufferInterfaceObject, Py_buffer& bufferStruct)
{
    if (PyObject_GetBuffer(bufferInterfaceObject, &bufferStruct, PyBUF_SIMPLE) == -1)
        return 0;

    return (void*)bufferStruct.buf;
}

不要忘记在不再需要时释放bufferStruct:

PyBuffer_Release(&bufferStruct);