J'utilise:
grepOut = subprocess.check_output("grep " + search + " tmp", Shell=True)
Pour exécuter une commande de terminal, je sais que je peux utiliser try/except pour détecter l'erreur, mais comment puis-je obtenir la valeur du code d'erreur?
J'ai trouvé ceci sur la documentation officielle:
exception subprocess.CalledProcessError
Exception raised when a process run by check_call() or check_output() returns a non-zero exit status.
returncode
Exit status of the child process.
Mais aucun exemple n’a été donné et Google n’a pas aidé.
Vous pouvez obtenir le code d'erreur et les résultats de l'exception générée.
Cela peut être fait à travers les champs returncode
et output
.
Par exemple:
import subprocess
try:
grepOut = subprocess.check_output("grep " + "test" + " tmp", Shell=True)
except subprocess.CalledProcessError as grepexc:
print "error code", grepexc.returncode, grepexc.output
y a-t-il un moyen d'obtenir un code de retour sans essai/sauf?
check_output
Déclenche une exception s'il reçoit un statut de sortie non nul car cela signifie souvent qu'une commande a échoué. grep
peut retourner un état de sortie différent de zéro même s'il n'y a pas d'erreur - vous pouvez utiliser .communicate()
dans ce cas:
from subprocess import Popen, PIPE
pattern, filename = 'test', 'tmp'
p = Popen(['grep', pattern, filename], stdin=PIPE, stdout=PIPE, stderr=PIPE,
bufsize=-1)
output, error = p.communicate()
if p.returncode == 0:
print('%r is found in %s: %r' % (pattern, filename, output))
Elif p.returncode == 1:
print('%r is NOT found in %s: %r' % (pattern, filename, output))
else:
assert p.returncode > 1
print('error occurred: %r' % (error,))
Vous n'avez pas besoin d'appeler une commande externe pour filtrer les lignes, vous pouvez le faire en pur Python:
with open('tmp') as file:
for line in file:
if 'test' in line:
print line,
Si vous n'avez pas besoin de la sortie; vous pouvez utiliser subprocess.call()
:
import os
from subprocess import call
try:
from subprocess import DEVNULL # Python 3
except ImportError: # Python 2
DEVNULL = open(os.devnull, 'r+b', 0)
returncode = call(['grep', 'test', 'tmp'],
stdin=DEVNULL, stdout=DEVNULL, stderr=DEVNULL)
Python 3.5 a introduit la méthode subprocess.run()
. La signature ressemble à:
subprocess.run(
args,
*,
stdin=None,
input=None,
stdout=None,
stderr=None,
Shell=False,
timeout=None,
check=False
)
Le résultat renvoyé est un subprocess.CompletedProcess
. En 3.5, vous pouvez accéder aux args
, returncode
, stdout
et stderr
du processus exécuté.
Exemple:
>>> result = subprocess.run(['ls', '/tmp'], stdout=subprocess.DEVNULL)
>>> result.returncode
0
>>> result = subprocess.run(['ls', '/nonexistent'], stderr=subprocess.DEVNULL)
>>> result.returncode
2
Pour obtenir le code de sortie et le code de retour (sans try/except), utilisez simplement subprocess.getstatusoutput (Python 3 requis)