web-dev-qa-db-fra.com

Le sous-processus check_output a renvoyé un statut de sortie non nul 1

Ceci est mon python code:

import subprocess
subprocess.check_output("ls",Shell=True,stderr=subprocess.STDOUT)

import subprocess
subprocess.check_output("yum",Shell=True,stderr=subprocess.STDOUT)

Le premier .check_output() fonctionne bien, mais le second renvoie ceci:

Traceback (most recent call last):
File "/usr/lib/x86_64-linux-gnu/gedit/plugins/pythonconsole/console.py", line 378, in __run
r = eval(command, self.namespace, self.namespace)
File "<string>", line 1, in <module>
File "/usr/lib/python3.4/subprocess.py", line 616, in check_output
raise CalledProcessError(retcode, process.args, output=output)
subprocess.CalledProcessError: Command 'yum' returned non-zero exit status 1

Pourquoi cela arrive-t-il? Est-ce parce que ls est la commande Shell d'origine mais que yum est le nouveau package? Comment puis-je résoudre ce problème?

42
Zongze Wu

La commande yum que vous avez lancée a été exécutée correctement. Il renvoie un statut différent de zéro, ce qui signifie qu'une erreur s'est produite lors du traitement de la commande. Vous voudrez probablement ajouter un argument à votre commande yum pour résoudre ce problème.

Votre code pourrait montrer cette erreur de cette façon:

import subprocess
try:
    subprocess.check_output("dir /f",Shell=True,stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
    raise RuntimeError("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))
39
Plouff

Le mot check_ dans le nom signifie que si la commande (le Shell dans ce cas, renvoie le statut de sortie de la dernière commande (yum dans ce cas)) renvoie un statut différent de zéro, elle déclenche alors CalledProcessError exception. C'est par conception. Si la commande que vous souhaitez exécuter peut renvoyer un statut différent de zéro en cas de succès, attrapez cette exception ou n'utilisez pas check_ méthodes. Vous pouvez utiliser subprocess.call dans votre cas parce que vous ignorez la sortie capturée, par exemple:

import subprocess

rc = subprocess.call(['grep', 'pattern', 'file'],
                     stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
if rc == 0: # found
   ...
Elif rc == 1: # not found
   ...
Elif rc > 1: # error
   ...

Vous n'avez pas besoin de Shell=True pour exécuter les commandes de votre question.

10
jfs