El otro día me encontré con un módulo interesante de python que no conocía: ctypes. Sirve para comunicarse con librerías en C: permite cargar librerías dinámicas y llamar a sus funciones, definir tipos equivalentes a los de C para pasarlos de un lado a otro e incluso especificar funciones python como callbacks de C. Vamos, que se pueden crear bindings a librerías externas escribiendo únicamente código python.
Ahi va un ejemplillo tonto usando la libavformat:
#!/usr/bin/python import sys from ctypes import * import ctypes.util av = CDLL(ctypes.util.find_library("avformat")) filename = sys.argv[1] # pFormatCtx deberia ser un puntero a AVFormatContext, # pero esto es solo un ejemplo simple :) pFormatCtx = c_void_p() av.av_register_all() av.av_open_input_file(byref(pFormatCtx), filename, None, 0, None) av.dump_format(pFormatCtx, 0, filename, 0)
Por supuesto para hacer algo más serio habría que declarar en python las estructuras como AVFormatContext que se definen en las cabeceras correspondientes y cosas así, pero entonces el programa de ejemplo sería demasiado engorroso como para leerlo en un blog ;). El ejemplo muestra una salida como esta:
$ ./av.py test.avi Input #0, avi, from 'test.avi': Duration: N/A, bitrate: N/A Stream #0.0: Video: mpeg4, 512x420, inf fps(c) Stream #0.1: Audio: vorbis, 22050 Hz, stereo, 24 kb/s
Referencias:
3 replies on “ctypes”
http://www.nongnu.org/cinvoke/lua.html
Ahà está el que te comenté antes. Para el resto, la versión lua de lo mismo. Que conste que no es un fundamentalismo-luero, solo una curiosidad :)
¿Cómo que no es fundamentalismo? ¿Quieres discutir conmigo? ;) Jejejejej
Ya sabÃa yo de ctypes y pasé de eso para usar SWIG. Pero creo que tras la experiencia de escribir un módulo para python aún usando clases oscuras creo que voy a dar una oportunidad ctypes.
Escribir módulos en C para python es horrible desde mi experiencia.
Yo también uso Lua, pero lo uso para dar soporte de script y/o configuración para programas escritos en C. Python lo uso para prototipos y RAD.