Предоставление файлового объекта из Cython - PullRequest
20 голосов
/ 25 ноября 2010

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

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

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

  • Мой код в классе cdef, другом (не-cdef) классе, который наследует как мой класс cdef, так и RawIOBase - Сбой с «TypeError: у нескольких баз есть конфликт размещения экземпляров»

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

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

Мои вопросы:

1) Я что-то упустил и заново изобретаю колесо?

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

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

1 Ответ

1 голос
/ 25 ноября 2011

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

...