从Cython中暴露出类似文件的对象

bde*_*dew 20 python file-io cython

我需要从C库中公开一个类似文件的对象,我用Cython模块包装它.我想重用python的通用io代码,比如缓冲,readline()等.

新的IO模块似乎正是我需要的,但实际上从Cython中使用它似乎是非平凡的,我尝试了几个方法:

  • 我的代码在一个继承自IO.RawIOBase的cdef类中 - 这失败了,因为cdef类只能从其他cython cdef类继承,而IO是"raw"C.

  • 我的代码在cdef类中,另一个(非cdef)类继承了我的cdef类和RawIOBase - 失败了"TypeError:多个base有实例布局冲突"

  • 我的代码在一个(非cdef)类中继承自RawIOBase - 这是有效的,但我放弃了在类中存储我的c级(我需要与底层库交谈)的能力,所以我需要一个make围绕它的cdef包装并将其存储为成员...这看起来像一团糟.

  • 我的cdef类中的代码不继承(Raw)IOBase而是重新实现它的功能,Python代码将我的对象包装在BufferedReader/BufferedWriter中 - 这个似乎比以前的选项更有效.

我的问题:

1)我错过了什么并在这里重新发明轮子?

2)我需要实现的IOBase的确切内容是什么,以保持BufferedReader/Writer在我当前和未来版本的python中对我的对象满意?这记录在哪里?

3)在Python是纯Python的python 2.6中如何工作?我想性能会受到影响,但它会起作用,对吗?

Bra*_*des 1

os.fdopen()调用底层库返回的文件描述符编号,然后将正常的 Python 方法调用分派到结果文件对象以执行输入和输出,效率是否太低?对于大多数 I/O,如果您能看到直接调用 C 例程或让 Python 方法分派逻辑为您调用它的区别,我会感到惊讶 \xe2\x80\x94 但是,当然,您可能会在这是一个不寻常的情况,我可能是错的!

\n