15.19 从C语言中读取类文件对象

    要读取一个类文件对象的数据,你需要重复调用 方法,然后正确的解码获得的数据。

    下面是一个C扩展函数例子,仅仅只是读取一个类文件对象中的所有数据并将其输出到标准输出:

    要测试这个代码,先构造一个类文件对象比如一个StringIO实例,然后传递进来:

    在我们的解决方案中,read() 方法从被传递的对象中提取出来。一个参数列表被构建然后不断的被传给 PyObject_Call() 来调用这个方法。要检查文件末尾(EOF),使用了 来查看是否返回对象长度为0.

    对于所有的I/O操作,你需要关注底层的编码格式,还有字节和Unicode之前的区别。本节演示了如何以文本模式读取一个文件并将结果文本解码为一个字节编码,这样在C中就可以使用它了。如果你想以二进制模式读取文件,只需要修改一点点即可,例如:

    本节最难的地方在于如何进行正确的内存管理。当处理 PyObject * 变量的时候,需要注意管理引用计数以及在不需要的变量的时候清理它们的值。对 Py_DECREF() 的调用就是来做这个的。

    最后,尽管类文件对象通常还提供其他方法(比如readline(), read_info()),我们最好只使用基本的 read()write() 方法。在写C扩展的时候,能简单就尽量简单。

    原文: