Voglio catturare il flusso stdout
di un comando shell in uno script python (3) ed essere in grado, allo stesso tempo, di controllare il codice di ritorno della shell comando se restituisce un errore (cioè se il suo codice di ritorno non è 0).Controllare il codice di ritorno di un comando quando il sottoprocesso solleva un'eccezione CalledProcessError
subprocess.check_output
sembra essere il metodo appropriato per farlo. Dalla pagina man subprocess
s':
check_output(*popenargs, **kwargs)
Run command with arguments and return its output as a byte string.
If the exit code was non-zero it raises a CalledProcessError. The
CalledProcessError object will have the return code in the returncode
attribute and output in the output attribute.
Eppure, non riesco ad ottenere il codice di ritorno del comando di shell quando non riesce. Il mio codice è simile al seguente:
import subprocess
failing_command=['ls', 'non_existent_dir']
try:
subprocess.check_output(failing_command)
except:
ret = subprocess.CalledProcessError.returncode # <- this seems to be wrong
if ret in (1, 2):
print("the command failed")
elif ret in (3, 4, 5):
print("the command failed very much")
Questo codice solleva un'eccezione nella gestione della deroga stessa:
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
AttributeError: type object 'CalledProcessError' has no attribute 'returncode'
Ammetto che non so dove ho sbagliato.
ringrazio molto, funziona come un fascino :) – michaelmeyer