Pitón

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

Cómo ejecutar comandos de shell en Python mediante el método de ejecución de subprocesos
El subproceso es un módulo de Python integrado 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 utilizar cualquier conmutador de línea de comandos asociado con el binario. Este artículo explicará cómo usar el módulo de subproceso y su método de ejecución en aplicaciones de Python. Todas las muestras de código del artículo se prueban con Python 3.8.2 en Ubuntu 20.04.

El subproceso.método de ejecución

El subproceso.El método de ejecución toma una lista de argumentos. Cuando se llama al método, ejecuta el comando y espera a que finalice el proceso, devolviendo un objeto "CompletedProcess" al final. El objeto "CompletedProcess" devuelve stdout, stderr, los 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 generado durante la ejecución del programa. Cualquier código de retorno distinto de cero (código de salida) significaría un error con el comando ejecutado en el subproceso.método de ejecución.

Ejemplo 1: contenido de salida de un archivo de texto mediante el subproceso.método de ejecución

El siguiente comando generará el contenido de un "data.txt ", asumiendo que contiene una cadena" name = John ".

subproceso de importación
subproceso.ejecutar (["gato", "datos.TXT"])

Ejecutar el código anterior devolverá el siguiente resultado:

nombre = John
CompletedProcess (args = ['gato', 'datos.txt '], código de retorno = 0)

El primer elemento del argumento de lista es el nombre del comando que se ejecutará. Cualquier elemento de la lista que sigue al primer elemento se considera opciones de línea de comandos o conmutadores. También puede usar un solo guión y guiones dobles para definir las opciones. Por ejemplo, para enumerar archivos y carpetas en un directorio, el código sería "subproceso.ejecutar (["ls", "-l"] ". En la mayoría de estos casos, puede considerar cualquier argumento separado por espacios en un comando de shell como un elemento individual en la lista proporcionada al subproceso.método de ejecución.

Ejemplo 2: suprimir la salida de un subproceso.método de ejecución

Para suprimir la salida del subproceso.ejecutar el método, tendrá que proporcionar "stdout = subprocess.DEVNULL ”y“ stderr = subproceso.DEVNULL ”como argumentos adicionales.

subproceso de importación
subproceso.ejecutar (["gato", "datos.txt "], stdout = subproceso.DEVNULL,
stderr = subproceso.DEVNULL)

Ejecutar el código anterior producirá el siguiente resultado:

CompletedProcess (args = ['gato', 'datos.txt '], código de retorno = 0)

Ejemplo 3: capturar la salida de un subproceso.método de ejecución

Para capturar la salida del subproceso.ejecutar el método, use un argumento adicional llamado "capture_output = True".

subproceso de importación
salida = subproceso.ejecutar (["gato", "datos.txt "], capture_output = True)
imprimir (salida)

Ejecutar el código anterior producirá el siguiente resultado:

CompletedProcess (args = ['gato', 'datos.txt '], código de retorno = 0,
stdout = b'name = John \ n ', stderr = b ")

Puede acceder individualmente a los valores stdout y stderr utilizando "output.stdout ”y“ salida.métodos 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 proporcionar "text = True" como un argumento adicional para el subproceso.ejecutar la llamada para obtener la salida en formato de cadena. Para obtener el código de estado de salida, puede utilizar la "salida.método de código de retorno.

Ejemplo 4: Generar una excepción en caso de falla del comando ejecutado por un subproceso.método de ejecución

Para generar una excepción cuando el comando sale con un estado distinto de cero, utilice el argumento "comprobar = Verdadero".

subproceso de importación
subproceso.ejecutar (["gato", "datos.tx "], capture_output = True, text = True, check = True)

Ejecutar el código anterior producirá el siguiente resultado:

elevar CalledProcessError (código de ret, proceso.argumentos,
subproceso.CalledProcessError: Comando '[' gato ',' datos.tx ']'
devolvió el estado de salida 1 distinto de cero.

Ejemplo 5: pasar una cadena a un comando ejecutado por el subproceso.método de ejecución

Puede pasar una cadena al comando para que lo ejecute el subproceso.ejecutar el método utilizando el argumento "input = 'string'".

subproceso de importación
salida = subproceso.ejecutar (["gato"], entrada = "datos.txt ", capture_output = Verdadero,
text = True, check = True)
imprimir (salida)

Ejecutar el código anterior producirá el siguiente resultado:

CompletedProcess (args = ['cat'], código de retorno = 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 un archivo, use el argumento“ stdin ”.

con open ("datos.txt ") como f:
salida = subproceso.ejecutar (["gato"], stdin = f, capture_output = True,
text = True, check = True)
imprimir (salida)

Ejecutar el código anterior producirá el siguiente resultado:

CompletedProcess (args = ['gato'], código de retorno = 0, stdout = "nombre = John \ n", stderr = ")

Ejemplo 6: ejecutar el comando directamente en el shell mediante el subproceso.método de ejecución

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

subproceso de importación
subproceso.ejecutar ("cat 'datos.txt '", shell = True)

Ejecutar el código anterior producirá el siguiente resultado:

nombre = John

Conclusión

El subproceso.El método de ejecución en Python es bastante poderoso, ya que le permite ejecutar comandos de shell dentro de 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 complicado tokenizar correctamente los comandos de shell en una lista de Python. Puede utilizar el "shlex.split () ”para convertir en token los comandos de shell simples, pero en comandos largos y complejos, especialmente aquellos con símbolos de tubería, shlex no divide correctamente el comando. En tales casos, la depuración puede ser un problema complicado. Puede utilizar el argumento "shell = True" para evitar esto, pero existen ciertos problemas de seguridad asociados con esta acción.

Puertos de código abierto de motores de juegos comerciales
Las recreaciones gratuitas, de código abierto y de motores de juegos multiplataforma se pueden usar para jugar títulos de juegos antiguos y también al...
Los mejores juegos de línea de comandos para Linux
La línea de comandos no es solo su mayor aliado cuando usa Linux, también puede ser la fuente de entretenimiento porque puede usarla para jugar muchos...
Las mejores aplicaciones de mapeo de gamepad para Linux
Si te gusta jugar juegos en Linux con un gamepad en lugar de un sistema de entrada de teclado y mouse típico, hay algunas aplicaciones útiles para ti....