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

时间:2010-11-25 15:08:03

标签: python file-io cython

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

新的IO模块似乎正是我所需要的,但实际上从Cython中使用它似乎并非易事,我已经尝试了几种方法:

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

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

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

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

我的问题:

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

2)为了让BufferedReader / Writer在我目前和未来的python版本中保持对象,我需要实现IOBase的确切内容是什么?这是在任何地方记录的吗?

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

1 个答案:

答案 0 :(得分:1)

在底层库返回的文件描述符号上调用os.fdopen(),然后将正常的Python方法调用调度到生成的文件对象以进行输入和输出是否效率太低?对于大多数I / O,如果您看到是否直接调用C例程或让Python方法调度逻辑为您调用它,我会感到惊讶 - 但是,当然,您可能处于异常情况而我可能是错的!