2010-11-25 13 views
18

我需要從C庫中公開一個類似於文件的對象,並使用Cython模塊進行封裝。我想重新使用Python的通用io代碼,如緩衝,readline()等等。從Cython暴露類似文件的對象

新的IO模塊似乎正是我需要的,但實際上從Cython使用它似乎是不平凡的,已經嘗試了幾種aproaches:

  • 我在從IO.RawIOBase繼承的CDEF類代碼 - 失敗的原因是CDEF類可以從其他用Cython CDEF類只繼承,而IO是「原始」 C.

  • 我的代碼在一個cdef類中,另一個繼承我的cdef類和RawIOBase的非cdef類 - 失敗了「TypeError:multiple bases實例佈局衝突「

  • 我的代碼在繼承自RawIOBase的(非cdef)類中 - 這可行,但我放棄了存儲我的c級別的能力(我需要與底層庫)裏面的東西,所以我需要在它周圍製作一個cdef包裝並將其作爲成員存儲......這看起來像一團糟。我的代碼在cdef類中不繼承(原始)IOBase而是重新實現了它的功能,Python代碼讓我的對象被包裝在BufferedReader/BufferedWriter中 - 這一個似乎工作起來並且比之前的選項更不混亂。

我的問題(S):

1)我缺少的東西,在這裏重新發明輪子?

2)IOBase的確切內容是什麼,我需要實現的目的是保持BufferedReader/Writer滿足於我的對象在當前和未來版本的Python中的滿意度?這是記錄在任何地方?

3)如何在python 2.6中工作,其中IO是純python?我想這樣的表現會受到影響,但它會起作用,對吧?

回答

1

對底層庫返回的文件描述符編號調用os.fdopen()效率太低,然後將正常的Python方法調用調度到生成的文件對象以執行輸入和輸出?對於大多數I/O,如果您能夠看到與您是直接調用C例程還是讓Python方法調度邏輯爲您調用它有所不同,那麼我會感到驚訝 - 但是,當然,您可能處於不正常的情況,而我可能是錯的!

+0

對不起,我以前沒有看到這個答案。這並不適用於我的情況,因爲我從第三方庫中得到的不是os級別的FD。 – bdew 2011-12-15 15:49:24