Enregistrer le message d'erreur de sous-processus de commande
Lors de l'exécution de commande bash à l'aide de sous-processus, je pourrais courir dans la situation où la commande n'est pas valide. Dans ce cas, bash renvoyait une erreur de message vocal. Comment peut-on attraper ce message? Je voudrais enregistrer ce message dans un fichier journal.
L'exemple suivant est un exemple, où j'essaie de la liste des fichiers dans un non-existait répertoire.
try:
subprocess.check_call(["ls", "/home/non"])
df = subprocess.Popen(["ls", "/home/non"], stdout=subprocess.PIPE)
output, err = df.communicate()
# process outputs
except Exception as error:
print error
sys.exit(1)
Bash serait imprime "ls: impossible d'accéder à /home/non: No such file or directory". Comment puis-je obtenir ce message d'erreur? L'erreur détectée par l'exception de la ligne est clairement différente, il est dit de la Commande "'['ls', '/home/non']' retourné non nulle de sortie d'état 2".
- Je pense que vous avez besoin de rediriger les deux: c'est à dire
stdout=subprocess.PIPE, stderr=subprocess.STDOUT
puis le message d'erreur sera danserr
. - Merci pour la suggestion. Je viens de vérifier, le message d'erreur est en sortie si l'option ajouter "stderr=..." à la Popen. Je préfère un moyen de rattraper ce message par le excepeté ligne, si il y a de tout. Des idées?
- Pour cela vous avez besoin de communication interprocessus. Depuis
subprocess.Popen()
pouvez commencer toute sorte d'autres processus qui serait difficile. Sur vos seules options générales sontreturncode
et de tuyaux. Pensez à utilisersubprocess.check_output
au lieu dePopen
.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez rediriger stderr dans un fichier objet:
De sortie de log.txt:
Si vous souhaitez que le message de l'exception:
Pour python 2.6 le
e.message
ne fonctionne pas. Vous pouvez utiliser la même version de python 2.7 estcheck_output
qui fonctionnera avec la version 2.6 de python:CalledProcessError
et imprimer le message"ls: impossible d'accéder à /home/non: No such file or directory" est généré par
ls
commande, pasbash
ici.Si vous voulez gérer les non-existant fichiers à l'aide de la gestion des exceptions ensuite utiliser
subprocess.check_output()
:De sortie
stderr
dans le global Python session, correct? Au lieu d'envoyer le message d'erreur(s) d'un fichier texte, comme Cunningham réponse décrit?.fileno()
) si vous souhaitez enregistrer stderr dans un fichier.