2010-11-25 3 views
18

Мне нужно выставить файл-подобный объект из библиотеки C, который я обертываю с помощью модуля Cython. Я хочу повторно использовать общий код io для python для таких вещей, как буферизация, readline() и т. Д.Публикация файлоподобного объекта из Cython

Новый модуль ввода-вывода, кажется, именно то, что мне нужно, но на самом деле его использование от Cython кажется нетривиальным, ве пытались несколько aproaches:

  • Мой код в классе CDEF, который наследуется от IO.RawIOBase - это терпит неудачу, потому что классы CDEF могут наследовать только от других классов Cython CDEF, в то время как IO является «сырой» С.

  • Мой код в классе cdef, еще один (не-cdef) класс, который наследует как мой класс cdef, так и RawIOBase - Fails with "TypeError: несколько баз имеют конфликт с планировкой экземпляра "

  • Мой код в классе (non-cdef), который наследуется от RawIOBase. Это работает, но я теряю возможность сохранять свой уровень c (мне нужно поговорить с базовой библиотекой) внутри класса, поэтому мне нужно сделать обертку cdef вокруг него и сохранить это как член ... это похоже на беспорядок.

  • Мой код в классе cdef, который не наследует (Raw). IOBase скорее переопределяет его функциональность, код Python получает мой объект, завернутый в BufferedReader/BufferedWriter. Этот, похоже, работает и менее беспорядочен, чем предыдущий.

Мои вопросы (ы):

1) Могу ли я что-то отсутствует и изобретать колесо здесь?

2) Что такое точный материал из IOBase, который мне нужно реализовать, чтобы поддерживать BufferedReader/Writer с моим объектом в текущих и будущих версиях python? Является ли это документированным где угодно?

3) Как это будет работать в python 2.6, где IO - чистый питон? Я думаю, что производительность будет страдать, но она будет работать, не так ли?

ответ

1

Было бы слишком неэффективно звонить os.fdopen() на номер дескриптора файла, возвращаемый базовой библиотекой, а затем отправлять обычные вызовы метода Python в результирующий файловый объект для ввода и вывода данных? С большинством ввода-вывода я был бы удивлен, если бы вы могли видеть разницу с тем, вызвали ли вы подпрограмму C напрямую или позвольте логике отправки метода Python вызвать ее для вас, - но, конечно, вы можете оказаться в необычной ситуации, и я может быть неправильно!

+0

Извините, я не видел этого ответа раньше. Это не совсем применимо к моему делу, поскольку то, что я получаю от сторонней библиотеки, не является FD уровня os. – bdew 2011-12-15 15:49:24

Смежные вопросы