web-dev-qa-db-fra.com

code retour subprocess.check_output

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é.

40
Juicy

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
57
DanGar

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)
32
jfs

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
11
mkobit

Pour obtenir le code de sortie et le code de retour (sans try/except), utilisez simplement subprocess.getstatusoutput (Python 3 requis)

1
simfinite