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?
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))
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.