Python: 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\nl\xc3\xadnea 2\nl\xc3\xadnea 3\n'

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\n'

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)
 in ()
----> 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\n"

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.

Retro

Lugares

Redes

Sistemas

Varios