Mzialla, вы не должны использовать «O!» в PyArg_ParseTupleAndKeywords. Это означает, что вы не можете передать любой объект, кроме указанного типа. Я считаю, что типичный подход к взаимодействию с файлами в расширениях Python 3.2 заключается не в том, чтобы предполагать какой-либо конкретный тип, а в программе против «протокола».
Так что вы должны сделать что-то вроде:
if(!PyArg_ParseTupleAndKeywords(args, kwds, "OO|l", kwlist,\
&in_file, &out_file, &bytes))
...
И после этого у вас есть два варианта: либо вы взаимодействуете с объектом потока, используя его методы Python, либо получаете файловый дескриптор потока (PyObject_AsFileDescriptor) и работаете с ним, используя уровень ОС read / запись функций (или эквивалент).
Для подхода с использованием метода Python вы должны получить метод read и вызвать его вместо fread. Что-то вроде следующего (не проверено):
PyObject *read = PyObject_GetAttrString(in_file, "read");
if (!read) handle_error;
while(encoded < bytes || bytes == 0) {
PyObject *bytes_obj= PyObject_CallFunction(read, "i", 1);
if (!bytes || !PyBytes_Check(bytes_obj)) handle_error;
char *s = PyBytes_AS_STRING(bytes_obj);
...
}
Тогда вам нужно будет сделать что-то подобное для стороны записи.