17 de mayo de 2016

38. Subprocess

SUBPROCESS

El módulo subprocess trabaja directamente llamadas al sistema operativo, como si fueran órdenes del shell de comandos.
El método más común es call (llamadas) al shell. Este método recibe una lista en la que el primer elemento es el comando a ejecutar y, los siguientes, sus modificadores. Por ejemplo, Este programa borrará el contenido del terminal
# -*- coding:utf-8 -*-

from subprocess import call

print "Llamada al shell... No se va a imprimir."
call("clear")
Y este programa imprimirá el listado de archivos de la carpeta actual.
# -*- coding:utf-8 -*-

from subprocess import call

print "Contenido de la carpeta actual"
print "=============================="

lista2 = ["ls","-lha"]
call(lista2)
= = =
El objeto Popen
Otro elemento del módulo subprocess es Popen (cuidado la primera "P" con mayúsculas). A diferencia de call, no es un método, sino un objeto. Actúa igual que call; recibe una lista como comando / argumento pero, a diferencia de éste, se puede llamar al método wait de popen para esperar que el comando finalice.
Por ejemplo, ejecuta este código
# -*- coding:utf-8 -*-

from subprocess import Popen
 
proceso = Popen(['ls', '-lha'])
proceso.wait()
# proceso2 = Popen(['clear'])
# proceso2.wait()
Descomenta, las dos últimas líneas. ¿Qué hace clear exactamente?
= = =
Leyendo stdin, stdout y stderr con Popen
Ya hemos hablado del flujo de datos estándar de entrada, de salida y de errores. Podemos, también, capturarlos con Popen. Analicemos el siguiente ejemplo:
# -*- coding:utf-8 -*-

from subprocess import PIPE, Popen
 
proceso = Popen(['ls', '-lha'], stdout=PIPE, stderr=PIPE)
error_encontrado = proceso.stderr.read()
proceso.stderr.close()
listado = proceso.stdout.read()
proceso.stdout.close()

if not error_encontrado: 
    print listado 
else: 
    print "Se produjo el siguiente error:\n%s" % error_encontrado
Para capturar mediante Popen la salida estándar, por ejemplo, necesitamos pasarle ese valor como argumento a través de un archivo o tubería. El mismo Popen provee una tubería llamada PIPE. Al hacerlo de esta forma, no hace falta poner el proceso en espera con wait, ya que se captura directamente por la tubería, y esas capturas son tratadas como archivos, por lo que hay que cerrarlos al terminar.
= = =
Documentación:
  1. Del módulo subprocess
  2. ¿Qué es una tubería?

No hay comentarios:

Publicar un comentario