Saltar al contenido

Comandos de subproceso y shell en Python

Descripción general del subproceso

Durante mucho tiempo he estado usando os.system () al tratar con system
tareas de administración en Python.

La principal razón de eso fue que pensé que era la forma más sencilla de
ejecutando comandos de Linux.

En la documentación oficial de Python podemos leer que se debe usar el subproceso
para acceder a los comandos del sistema.

El módulo de subprocesos nos permite generar procesos, conectarse a sus
canalizaciones de entrada / salida / error y obtener sus códigos de retorno.

El subproceso tiene la intención de reemplazar varios otros módulos y funciones más antiguos,
como: os.system, os.spawn *, os.popen *, popen2. * comandos.

Comencemos a analizar las diferentes funciones del subproceso.

subprocess.call ()

Ejecute el comando descrito por “args”.

Podemos ejecutar la línea de comando con los argumentos pasados ​​como una lista de cadenas
(ejemplo 1) o estableciendo el argumento de shell en un valor verdadero (ejemplo 2)

Tenga en cuenta que el valor predeterminado del argumento de shell es Falso.

Veamos dos ejemplos donde mostramos el resumen del uso del disco usando
subprocess.call ()

subprocess.call(['df', '-h'])

Esta vez establecemos el argumento de shell en True

subprocess.call('du -hs $HOME', shell=True)

Tenga en cuenta que la documentación oficial de Python indica una advertencia sobre el uso de
shell = Argumento verdadero.

“Invocar el shell del sistema con shell = True puede ser un peligro para la seguridad si se combina
con una entrada que no es de confianza ” [source]

Ahora, sigamos adelante y veamos la entrada / salida.

Entrada y salida

Con el subproceso puede suprimir la salida, lo cual es muy útil cuando
desea ejecutar una llamada al sistema pero no está interesado en la salida estándar.

Entrenamiento de Python recomendado

Para el entrenamiento de Python, nuestra principal recomendación es DataCamp.

También le brinda una forma de integrar limpiamente los comandos de shell en sus scripts
mientras gestiona la entrada / salida de forma estándar.

Códigos de retorno

Puede utilizar los códigos de retorno subprocess.call para determinar el éxito del comando.

Cada proceso devolverá un código de salida y puede hacer algo con su script
basado en ese código.

Si el código de retorno es distinto de cero, significa que ocurrió un error.

Si desea realizar la administración del sistema en Python, le recomiendo leer
Python para la administración de sistemas Unix y Linux

stdin, stdout y stderr

Una de las partes más complicadas que tuve con el subproceso fue cómo trabajar con tuberías
y canalizar comandos juntos.

PIPE indica que se debe crear una nueva tubería para el niño.

La configuración predeterminada es “Ninguno”, lo que significa que no se producirá ninguna redirección.

El error estándar (o stderr) puede ser STDOUT, que indica que el stderr
Los datos del proceso hijo deben capturarse en el mismo identificador de archivo que
para stdout.

subprocess.Popen ()

La creación y gestión del proceso subyacente en el módulo de subproceso es
manejado por la clase Popen. subprocess.popen está reemplazando a os.popen.

Comencemos con algunos ejemplos reales.

subprocess.Popen toma una lista de argumentos

import subprocess

p = subprocess.Popen(["echo", "hello world"], stdout=subprocess.PIPE)

print p.communicate()

>>>('hello world', None)

Tenga en cuenta que, aunque podría haber utilizado “shell = True”, no es el recomendado
forma de hacerlo.

Si sabe que solo trabajará con funciones de subproceso específicas,
como Popen y PIPE, entonces es suficiente importar solo esos.

from subprocess import Popen, PIPE

p1 = Popen(["dmesg"], stdout=PIPE)

print p1.communicate()

Popen.communicate ()

El método comunica () devuelve una tupla (stdoutdata, stderrdata).

Popen.communicate () interactúa con el proceso: envía datos a stdin.

Leer datos de stdout y stderr, hasta llegar al final del archivo.

Espere a que termine el proceso.

El argumento de entrada opcional debe ser una cadena que se enviará al
proceso hijo, o Ninguno, si no se deben enviar datos al hijo.

Básicamente, cuando usa comunica () significa que quiere
ejecutar el comando

Programa de ping usando subproceso

En la sección “Más lectura” a continuación, puede encontrar enlaces para leer más
sobre el módulo de subproceso, pero también ejemplos.

Escribamos nuestro propio programa de ping donde primero le pedimos al usuario que ingrese,
y luego realice la solicitud de ping a ese host.

# Import the module
import subprocess

# Ask the user for input
host = raw_input("Enter a host to ping: ")	

# Set up the echo command and direct the output to a pipe
p1 = subprocess.Popen(['ping', '-c 2', host], stdout=subprocess.PIPE)

# Run the command
output = p1.communicate()[0]

print output

Demos un ejemplo más. Esta vez usamos el comando host.

target = raw_input("Enter an IP or Host to ping:
")

host = subprocess.Popen(['host', target], stdout = subprocess.PIPE).communicate()[0]

print host

Le recomiendo que lea los enlaces a continuación para obtener más conocimientos sobre el
módulo de subproceso en Python.

Si tiene alguna pregunta o comentario, utilice el campo de comentarios a continuación.

Más lectura

Cómo sh en Python
http://docs.python.org/2/library/subprocess.html
El módulo de subprocesos siempre útil y ordenado
http://pymotw.com/2/subprocess/
http://www.bogotobogo.com/python/python_subprocess_module.php

Entrenamiento de Python recomendado

Para el entrenamiento de Python, nuestra principal recomendación es DataCamp.