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.