2012-10-07 15 views
7

Tengo un diseño pobre y grande (> 300 public functions, >200 numeric constants definido con #define en el archivo de encabezado) que tengo que ajustar en Python. Tengo el dll y el archivo h. La biblioteca se actualiza anualmente, hasta ahora de una manera compatible hacia atrás (es decir, solo se agregaron funciones, una constante mantiene sus valores numéricos, etc.). Pero no tengo garantías ya que no controlo la biblioteca.Mantenibilidad de una envoltura de python de una biblioteca C

Usando ctypes, veo dos formas de envolver esto en Python:

  1. Mapeo de cada función constante y al pitón, del 1 al 1
  2. La redefinición de la API de Python y hacer llamadas a la biblioteca .

La primera se puede hacer en un (más o menos) de forma automática desde el archivo de cabecera y por lo tanto es más fácil de mantener y actualizar, la segunda requiere una gran cantidad de código Python, pero será más fácil de usar.

Agradeceré algunas opiniones basadas en su experiencia con este tipo de problema y algunos ejemplos.

+0

Lo siento pero tan bueno como esto es, no es realmente una pregunta clara. –

+3

Eche un vistazo a SWIG. –

+0

[SIP] (http://pypi.python.org/pypi/SIP/4.14) puede ser una solución interesante. –

Respuesta

4

Recientemente utilicé ctypesgen para crear una envoltura de tipos para SDL y bibliotecas complementarias (SDL_image, SDL_ttf, SDL_mixer).

Para mí, funcionó bastante bien. Genera Python 2.x, pero pude obtener el código 3.x deseado utilizando la utilidad "2to3".

Creo que es una buena idea utilizar el envoltorio de los tipos como base para una API más "pitónica", y eso es básicamente lo que hice (en un nivel muy simple) con mi módulo pslab.

Por lo tanto, si está buscando hacer algo similar, esa sería una de las formas.

0

Mantener una biblioteca de Python con un back-end de ctypes no es un enfoque inmanejable. Obviamente, la inversión inicial es mayor que con herramientas automatizadas, pero la API que le queda debería ser mucho mejor.

Si sigue esa ruta, intente separar la API de Python completamente de la biblioteca C. Soportar múltiples backends de ctypes con una API de Python no es tan malo, solo consulta en tiempo de ejecución y carga dinámicamente el módulo de envoltura de ctypes correcto. Lo hice para envolver diferentes archivos dll y archivos .so para Windows y Linux, pero también funcionaría para las versiones de una biblioteca.

Cuestiones relacionadas