miércoles, 12 de febrero de 2014

Ejecutar un comando externo

A continuación, se muestran varias posibilidades para ejecutar comandos externos desde un programa Python:

#!usr/bin/env Python
# -*- coding: utf-8 -*-

import os, sys
import subprocess

# Ejecutar un comando con "os.system(comando)" y mostrar en
# pantalla la salida del comando y el resultado de la 
# ejecución.
# Si su valor es 0 la ejecución finalizó con éxito.

valor1 = os.system("whoami")
print("Resultado:", valor1)

# Ejecutar un comando "erróneo" con "os.system(comando)"

valor2 = os.system("whoamix")
print("Resultado:", valor2)

# Ejecutar varios comandos con "os.system(comando)"

comando3 = "ls -l | grep 'txt' >textos.txt"
valor3 = os.system(comando3)
print("Resultado:", valor3)

# Ejecutar un comando con "os.popen(comando)" y capturar su 
# salida

comando4 = "uname -srmo"
salida4 = os.popen(comando4).read()
print("Salida:\n", salida4)

# A continuación, se muestran varios ejemplos con el módulo 
# "subprocess" que genera un nuevo proceso para ejecutar el
# comando permitiendo controlar su ejecución y obtener su 
# salida y/o errores que pudieran darse.

# Ejecutar un comando externo con "subprocess.call", mostrar 
# su salida y el resultado de su ejecución.

valor5 = subprocess.call(["ping", "-c 6", "www.elpais.es"])
print("Este texto se mostrará después de ejecutar el comando")
print("Resultado:", valor5)

# Ejecutar un comando externo en paralelo con 
# "subprocess.Popen" con wait() se espera a que termine
# la ejecución del subproceso
# Todas las líneas de código delante de wait() se 
# ejecutarán en paralelo a la ejecución del comando.
# También, se mostrará si la ejecución terminó o no
# con éxito

proceso6 = subprocess.Popen(['ls', '-lha'])
for num in range(100):
    print ("Este texto se mostrará antes")

valor6 = proceso6.wait()
print ("Este texto se mostrará después")
print ("Resultado:", valor6)

# Ejecutar un comando externo en paralelo con
# "subprocess.Popen"

proceso7 = subprocess.Popen(['ls', '-lha'])
for num in range(300):
    print ("Este texto se mostrará en paralelo")

# Ejecutar un comando en paralelo con 
# "subprocess.Popen" y capturar su salida y
# los errores que puedieran darse

proceso8 = subprocess.Popen(['ls', '-a'], 
                            stdout=subprocess.PIPE, 
                            stderr=subprocess.PIPE)
errores8 = proceso8.stderr.read()
salida8 = proceso8.stdout.read()
proceso8.stderr.close()
proceso8.stdout.close()
print("Salida de errores:\n")
errores8 = errores8.decode(sys.getdefaultencoding())
print(errores8)
salida8 = salida8.decode(sys.getdefaultencoding())
print("Salida del comando:\n")
print(salida8)

# Ejecutar un comando externo con "subprocess.Popen" y 
# obtener su salida y los errores que puedan darse (Otra 
# manera de hacerlo)
# En el ejemplo se provoca un error y se muestra el texto
# de su salida

proceso9 = subprocess.Popen(["ping", 
                            "-zz 4", 
                            "www.elpais.es"], 
                            stdout=subprocess.PIPE)
salida9, errores9 = proceso9.communicate()
print(salida9.decode(sys.getdefaultencoding()))
if errores9 != None:
    print(errores9.decode(sys.getdefaultencoding()))

# Para resolver variables de entorno, patrones globales y
# otras caracteristicas de la shell hay que incluir el 
# parámetro "shell = True"

print("Correcto  : subprocess.call('echo $HOME', shell=True)")
print("Incorrecto: subprocess.call('echo $HOME')")
# Es equivalente a shell = False

subprocess.call('echo $HOME', shell=True)

# Ejecutar un comando externo con subprocess.Popen() y
# obtener su salida en tiempo real

comando11 = "ping -c3 www.elpais.es"
resultado11 = subprocess.Popen(comando11, 
                               shell=True, 
                               stdout=subprocess.PIPE)
for salida11 in resultado11.stdout:
    print(salida11.decode(sys.getdefaultencoding()).rstrip())

# Ejecutar un comando externo con subprocess.Popen()
# y obtener la salida en tiempo real (Otra forma de
# hacerlo)

comando12 = "ping -c2 www.elpais.es"
resultado12 = subprocess.Popen(comando12, 
                               shell=True, 
                               stdout=subprocess.PIPE)
while resultado12.poll() is None:
    salida12 = resultado12.stdout.readline()
    print(salida12.decode(sys.getdefaultencoding()).rstrip())



Ir al índice del tutorial de Python