martes, 13 de octubre de 2009

Bash desde Python

Hoy tuve que ajustar un programa hecho en python que me manda información automáticamente, y, entre otras cosas, me informa mi propia IP externa por email. Anteriormente usaba comandos python para bajar una página web e interpretar sus lineas. Esta vez, sin embargo, ya que tenía que modificar justo esa parte, decidí implementar algo distinto.

Para eso tuve que realizar la investigación de como usar bash desde dentro de un programa Python. Encontré dos alternativas, una con os y otra con commands. Hay más, creo que una es popen, pero como command implementa una interfase para popen, me pareció suficiente.

Vayamos primero por la opción que usé primero, que no fue la que terminé usando finalmente.

import os
resultado = os.system("ls")

Este comando guarda en resultado un cero si el comando ejecutado se ejecutó con éxito, y un valor distinto a cero si no lo hizo. La salida del comando se produce por la consola, y no podemos traer el resultado a Python. Esto fue lo que hizo que lo descartase, ya que yo justamente precisaba el resultado real, y no el valor de éxito del comando.

Entonces tuve que usar la otra alternativa
import commands
resultado = commands.getoutput("ls")

Este comando no trae un cero en caso de éxito, sino que devuelve un string con el resultado del comando ls, que lista el directorio. Por supuesto que hay comandos especiales para manipular archivos y directorios sin recurrir a comandos bash, ls es solo usado a modo de demostración. Una aclaración importante: el módulo commands solo funciona bajo Linux. Como mi programa no necesita ser portable, lo he usado. Si sus necesidades son diferentes, tal vez lo solucionen con popen.

Por último, les dejo una perlita que encontré en la red y que estuve analizando para ver si me servía, determinando finalmente que si. Este es el comando BASH que, consultando una página web, devuelve nuestra propia IP externa.

lynx -dump http://checkip.dyndns.org/ | grep IP | awk {'print $4'}

Bonito ¿no es cierto?

8 comentarios:

  1. me fue muy útil muchas gracias :D

    ResponderEliminar
  2. Gracias por la información, me ha servido!

    ResponderEliminar
  3. gracias me sirvio para llamar el Mplayer desde python =P

    ResponderEliminar
  4. Realmente me alegro muchísimo de que algo como esto haya sido tan util para tanta gente.

    ResponderEliminar
  5. ahora con python3 todo esto cambió, hay un módulo nuevo llamado subprocess que hay que aprender a usar.

    ResponderEliminar
  6. Ahora en python3 ha cambiado todo. Hay que usar subprocess.

    ResponderEliminar
  7. uff, llevaba toda la mañana intentando con subprocess y con os, me has salvado de la locura!!, GRACIAS!

    ResponderEliminar