subprocess.run

run(*popenargs, input=None, capture_output=False, timeout=None, check=False, **kwargs)

Este método ejecuta un proceso con argumentos y devuelve una instancia del proceso completado. Esta instancia tendrá atributos de argumentos, código de retorno (returncode), salida estándar (stdout) y error estándar (stderr). Ni stdout, ni stderr se capturan por defecto, así que los atributos serán None, para poder usarlos, tendremos que pasarles un PIPE para capturarlos.

*popenargs es una tupla que contiene el comando y los argumentos a ejecutar, por ejemplo: (‘ls’,’-l’) o (‘notepad’,’nuevanota.txt’).

Pasaremos el argumento stdout = subprocess.PIPE para obtener la salida estándar en stdout cuando finalice el proceso y haremos lo mismo con stderr, es decir stderr = subprocess.PIPE para obtener el error estándar.

Si check es igual a True y el código de salida no es cero, se produce una excepción del tipo CalledProcessError. El objeto CalledProcessError tendrá el returncode y el stdout y stderr, si estos últimos se hubieran capturado.

Si se le proporciona un valor al timeout en segundos, y el proceso tarda mas de lo indicado, se producirá una excepción del tipo TimeoutExpired.

Existe un argumento opcional que se llama input que permite pasar bytes o una cadena al subproceso entrada estándar (stdin). Si se usa este argumento entonces no se puede pasar también el constructor de stdin del argumento popen.

La comunicación por defecto se realiza en bytes, por lo tanto, cualquier input debería ser en bytes y la stdout y el stderr también lo serán. Si la comunicación fuera en modo texto, el input debería ser un string y el stdout y stderr también serán strings decodificadas en base a la codificación locale.

El siguiente ejemplo ejecuta el comando ls -l el cual muestra los ficheros que se encuentra en el directorio del programa.

import subprocess
proceso = subprocess.run( ( 'ls' , '-l' ) , stdout = subprocess.PIPE )
print( proceso.stdout.decode( "utf-8" ) )

Se pueden controlar la excepción con check = True, como en el siguiente ejemplo donde cometemos un error intencionado al buscar en una carpeta que no existe.

try:
    p = subprocess.run(('find','/folder_no_existe','.'), stdout = subprocess.PIPE, check = True)
    print(p.stdout.decode("utf-8"))
except subprocess.CalledProcessError as e:
    print('El error es: ', e)

El resultado será esto:

pyAdminServers python3 procesos.py
find: /folder_no_existe: No such file or directory
El error es:  Command '('find', '/folder_no_existe', '.')' returned non-zero exit status 1.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *