Cómo ejecutar comandos de shell en Python usando el método de ejecución de subprocesos

Cómo ejecutar comandos de shell en Python usando el método de ejecución de subprocesos
El subproceso es un módulo de Python incorporado que se puede utilizar para crear nuevos procesos e interactuar con sus flujos de datos de entrada y salida. En términos más simples, puede usarlo para ejecutar comandos de shell y ejecutar binarios ejecutables generalmente dispersos en varias carpetas "bin" en un sistema de archivos de Linux. También puede proporcionar una ruta completa a un binario ejecutable y usar cualquier interruptor de línea de comandos asociado con el binario. Este artículo explicará cómo usar el módulo de subprocesos y su método de ejecución en las aplicaciones de Python. Todas las muestras de código en el artículo se prueban con Python 3.8.2 en Ubuntu 20.04.

El subproceso.Método de ejecución

El subproceso.Ejecutar el método toma una lista de argumentos. Cuando se llama al método, ejecuta el comando y espera a que el proceso finalice, devolviendo un objeto de "proceso completo" al final. El objeto "CompleteProcess" devuelve STDOUT, STDERR, argumentos originales utilizados al llamar al método y un código de retorno. STDOut se refiere al flujo de datos producido por el comando, mientras que Stderr se refiere a cualquier error planteado durante la ejecución del programa. Cualquier código de retorno no distinto de cero (código de salida) significaría un error con el comando ejecutado en el subprocesos.Método de ejecución.

Ejemplo 1: Contenido de salida de un archivo de texto utilizando el subproceso.Método de ejecución

El siguiente comando producirá el contenido de un "datos.Archivo de txt ", suponiendo que contiene una cadena" nombre = John ".

importar subprocesos
subproceso.ejecutar (["gato", "datos.TXT"])

Ejecutar el código anterior devolverá la siguiente salida:

Nombre = John
Datos completos de procesos (args = ['cat',.txt '], returncode = 0)

El primer elemento del argumento de la lista es el nombre del comando que se ejecutará. Cualquier elemento en la lista que siga el primer elemento se consideran opciones o conmutadores de línea de comandos. También puede usar guiones de tablero único y doble para definir las opciones. Por ejemplo, para enumerar archivos y carpetas en un directorio, el código estaría "subprocesos.ejecutar (["ls", "-l"] ". En la mayoría de estos casos, puede considerar cualquier argumento separado por el espacio en un comando shell como un elemento individual en la lista suministrada al subproceso.Método de ejecución.

Ejemplo 2: suprimir la salida del subproceso.Método de ejecución

Para suprimir la salida del subproceso.Método de ejecución, tendrá que suministrar "stDout = subprocesos.Devnull "y" stderr = subprocesos.Devnull ”como argumentos adicionales.

importar subprocesos
subproceso.ejecutar (["gato", "datos.txt "], stdout = subprocesos.Devnull,
stderr = subprocesamiento.Devnull)

Ejecutar el código anterior producirá la siguiente salida:

Datos completos de procesos (args = ['cat',.txt '], returncode = 0)

Ejemplo 3: Captura de salida de subproceso.Método de ejecución

Para capturar la salida del subproceso.Método Ejecutar, use un argumento adicional llamado "Capture_output = True".

importar subprocesos
salida = subprocesos.ejecutar (["gato", "datos.txt "], captura_output = true)
Imprimir (salida)

Ejecutar el código anterior producirá la siguiente salida:

Datos completos de procesos (args = ['cat',.txt '], returncode = 0,
stdout = b'name = John \ n ', stderr = b ")

Puede acceder individualmente a los valores de STDOUT y STDERR utilizando "salida.stdout "y" salida.Métodos de stderr ”. La salida se produce como una secuencia de bytes. Para obtener una cadena como salida, use "salida.stdout.Método Decode ("UTF-8") ". También puede suministrar "Text = True" como un argumento adicional para el subprocesamiento.Ejecutar la llamada para obtener la salida en formato de cadena. Para obtener el código de estado de salida, puede usar la "salida.método de returncode ".

Ejemplo 4: elevar la excepción al falla del comando ejecutado por subprocesos.Método de ejecución

Para plantear una excepción cuando el comando sale con un estado distinto de cero, use el argumento "cheque = true".

importar subprocesos
subproceso.ejecutar (["gato", "datos.tx "], captura_output = true, text = true, check = true)

Ejecutar el código anterior producirá la siguiente salida:

elevar llamado ProcessError (RetCode, Process.argumentos,
subproceso.Llamado Processerror: Comando '[' CAT ', datos.tx ']'
Estado de salida no cero devuelto 1.

Ejemplo 5: pase una cadena al comando ejecutado por el subprocesos.Método de ejecución

Puede pasar una cadena al comando que se ejecutará por subprocesos.Ejecutar el método utilizando el argumento "input = 'string'".

importar subprocesos
salida = subprocesos.ejecutar (["cat"], input = "datos.txt ", captura_output = verdadero,
text = true, check = true)
Imprimir (salida)

Ejecutar el código anterior producirá la siguiente salida:

CompletyProcess (args = ['cat'], returncode = 0, stdout = 'datos.txt ', stderr = ")

Como puede ver, el código anterior pasa "datos.txt "como una cadena y no como un objeto de archivo. Para pasar "datos.txt "Como archivo, use el argumento" stdin ".

con abre ("datos.txt ") como f:
salida = subprocesos.Run (["Cat"], stdin = f, captura_output = true,
text = true, check = true)
Imprimir (salida)

Ejecutar el código anterior producirá la siguiente salida:

CompletyProcess (args = ['cat'], returncode = 0, stdout = 'name = John \ n', stderr = ")

Ejemplo 6: Ejecutar el comando directamente en shell usando el subproceso.Método de ejecución

Es posible ejecutar un comando directamente en un shell "tal cual", en lugar de usar una cadena dividida en el comando principal y las opciones que lo siguen. Para hacer esto, debe pasar "shell = verdadero" como argumento adicional. Sin embargo, esto es desanimado por los desarrolladores de Python, ya que el uso de "shell = true" puede conducir a problemas de seguridad. Puede leer más sobre implicaciones de seguridad desde aquí.

importar subprocesos
subproceso.Ejecutar (datos de "gato '.txt '", shell = true)

Ejecutar el código anterior producirá la siguiente salida:

Nombre = John

Conclusión

El subproceso.Ejecutar el método en Python es bastante poderoso, ya que le permite ejecutar comandos de shell dentro de la propia Python. Esto ayuda a limitar todo el código a Python sin la necesidad de tener un código de script de shell adicional en archivos separados. Sin embargo, puede ser bastante difícil tokenizar correctamente los comandos de shell en una lista de Python. Puedes usar el "shlex.Método Split () "para tokenizar comandos de shell simples, pero en comandos largos y complejos, especialmente aquellos con símbolos de tubería, SHLEX no puede dividir correctamente el comando. En tales casos, la depuración puede ser un tema complicado. Puede usar el argumento "shell = verdadero" para evitar esto, pero hay ciertas preocupaciones de seguridad asociadas con esta acción.