Python: Módulo: Subprocess
Cómo ejecutar comandos de forma simple:
In [1]: import subprocess In [2]: salida = subprocess.Popen(['zcat','fichero.log.gz'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) In [3]: stdout, stderr = salida.communicate() In [4]: stdout Out[4]: b'l1nea 1 línea 2 línea 3 ' In [5]: stderr Out[5]: b'' In [6]: salida = subprocess.Popen(['zcat','fichero3.log.gz'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) In [7]: stdout, stderr = salida.communicate() In [8]: stdout Out[8]: b'' In [9]: stderr Out[9]: b'gzip: fichero3.log.gz: No such file or directory '
De forma simple obtenemos la salida del comando y su error, en el primer caso stderr
está vacío ya que NO da error, y en el segundo caso es stdout
el que está vacío ya que ha habido un error.
Cómo ejecutar comandos de forma simple y más compatible con versiones anteriores:
In [1]: import subprocess In [2]: salida = subprocess.check_output('ls -l fichero_que_no_existe', stderr=subprocess.STDOUT,shell=True) --------------------------------------------------------------------------- CalledProcessError Traceback (most recent call last) <ipython-input-2-2db263e9d079> in <module>() ----> 1 salida = subprocess.check_output('ls -l fichero_que_no_existe', stderr=subprocess.STDOUT,shell=True) /usr/lib/python3.5/subprocess.py in check_output(timeout, *popenargs, **kwargs) 314 315 return run(*popenargs, stdout=PIPE, timeout=timeout, check=True, --> 316 **kwargs).stdout 317 318 /usr/lib/python3.5/subprocess.py in run(input, timeout, check, *popenargs, **kwargs) 396 if check and retcode: 397 raise CalledProcessError(retcode, process.args, --> 398 output=stdout, stderr=stderr) 399 return CompletedProcess(process.args, retcode, stdout, stderr) 400 CalledProcessError: Command 'ls -l fichero_que_no_existe' returned non-zero exit status 2 In [3]: salida = subprocess.check_output('ls -l fichero_que_no_existe ; exit 0', stderr=subprocess.STDOUT,shell=True) In [4]: salida Out[4]: b"ls: no se puede acceder a 'fichero_que_no_existe': No existe el fichero o el directorio "
Como podemos ver si la salida del comando a ejecutar NO DA CERO se produce una excepción CalledProcessError
, podemos engañar usando el "exit 0" para casos en los que sepamos que no devuelve una salida de CERO.
Enlace a la documentación Subprocess.