2010-11-25 11 views
18

Necesito exponer un objeto similar a un archivo desde una biblioteca C que estoy envolviendo con un módulo Cython. Quiero reutilizar el código genérico de python para cosas como almacenamiento en búfer, readline(), etc.Exponer un objeto similar a un archivo desde Cython

El nuevo módulo de IO parece ser justo lo que necesito, pero en realidad usarlo de Cython parece no ser trivial, ' he intentado varias aproaches:

  • Mi código en una clase que hereda de cdef IO.RawIOBase - Esta falla porque las clases CDEF se heredan sólo de otras clases Cython CDEF, mientras IO es "cruda" C.

  • Mi código en una clase cdef, otra clase (no cdef) que hereda mi clase cdef y RawIOBase - falla con "TypeError: múltiples bases tienen conflicto de diseño de instancias "

  • Mi código en una clase (no cdef) que hereda de RawIOBase - Esto funciona, pero pierdo la capacidad de almacenar mi c-level (que necesito para hablar con la biblioteca subyacente) cosas dentro de la clase, así que necesito hacer una envoltura de cdef y almacenar eso como miembro ... esto parece un desastre.

  • Mi código en clase cdef que no hereda (Raw) IOBase más bien vuelve a implementar su funcionalidad, el código Python obtiene mi objeto envuelto en BufferedReader/BufferedWriter - Este parece funcionar y menos desordenado que la opción anterior.

Mis preguntas (s):

1) ¿Me estoy perdiendo algo y reinventar la rueda aquí?

2) ¿Cuál es el material exacto de IOBase que debo implementar para mantener BufferedReader/Writer satisfecho con mi objeto en las versiones actuales y futuras de python? ¿Está esto documentado en algún lugar?

3) ¿Cómo funciona eso en Python 2.6 donde IO es python puro? Supongo que ese rendimiento sufrirá pero funcionará, ¿verdad?

Respuesta

1

¿Sería demasiado ineficiente llamar al os.fdopen() en el número de descriptor de archivo devuelto por la biblioteca subyacente, y luego despachar las llamadas normales al método de Python al objeto de archivo resultante para hacer su entrada y salida? Con la mayoría de E/S, me sorprendería si pudiera ver una diferencia con si llamó directamente a una rutina de C o si dejó que la lógica de envío del método de Python la llame por usted, pero, por supuesto, es posible que se encuentre en una situación inusual y podría estar equivocado!

+0

Disculpa, no he visto esta respuesta antes. Esto no es realmente aplicable a mi caso, ya que lo que obtengo de la biblioteca de terceros no es un FD de nivel os. – bdew

Cuestiones relacionadas