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ónsubproceso.ejecutar (["gato", "datos.TXT"])
Ejecutar el código anterior devolverá el siguiente resultado:
nombre = JohnCompletedProcess (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ónsubproceso.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ónsalida = 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ónsubproceso.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ónsalida = 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ónsubproceso.ejecutar ("cat 'datos.txt '", shell = True)
Ejecutar el código anterior producirá el siguiente resultado:
nombre = JohnConclusió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.