ctypes

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 Comments

  1. pplux said,

    June 6, 2008 @ 20:50 pm

    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 :)

  2. kraptor said,

    June 9, 2008 @ 08:34 am

    ¿Cómo que no es fundamentalismo? ¿Quieres discutir conmigo? ;) Jejejejej

  3. .teri said,

    January 29, 2009 @ 14:11 pm

    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.

RSS feed for comments on this post

This blog is protected by Dave\'s Spam Karma 2: 17770 Spams eaten and counting...