2009-05-27 13 views
4

J'ai vu cela posté tellement de fois ici; mais n'a pas réussi à capturer les erreurs intentionnelles de la commande. Meilleur travail partiel que j'ai trouvé jusqu'ici ..capture stderr à partir de python subprocess.Popen (commande, stderr = subprocess.PIPE, stdout = subprocess.PIPE)

from Tkinter import * 
import os 
import Image, ImageTk 
import subprocess as sub 
p = sub.Popen('datdsade',stdout=sub.PIPE,stderr=sub.PIPE) 
output, errors = p.communicate() 

root = Tk() 
text = Text(root) 
text.pack() 
text.insert(END, output+ "Error: " + errors) 
root.mainloop() 
+1

Merci pour votre place spliff de réponse sur. Pour plus de clarté "PyMOTW: Doug Hellmann subprocess" ici [http://www.oreillynet.com/onlamp/blog/2007/08/pymotw_subprocess_1.html] de Tkinter import * importation subprocess proc = sous-processus .Popen ('TestSomeCommandThatDoesNotExisit', shell = True, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.STDOUT,) stdout_value, stderr_value = proc.communicate() root = Tk() text = texte (racine) text.pack() text.insert (FIN, rééd (stdout_value)) root.mainloop() Je ne fusionnez stderr = sub.STDOUT Merci encore ombre :) ~ nolo –

Répondre

2

Êtes-vous sûr à 100% que 'datdsade' écrit réellement sur stderr? Si c'est le cas, il tamponne peut-être son stderr, ou bloque dessus.

EDIT: Je suggère d'exécuter 'datdsade' (votre programme) dans bash (en supposant que vous avez linux, vous pouvez dl sh.exe pour Windows) et voir si vous pouvez capturer votre stderr à un fichier datdsade 2> erreurs .SMS. Sachez que si vous êtes sur Windows stderr ne sera pas sorti dans une fenêtre DOS. Vous aurez peut-être plus de chance d'écrire d'abord dans un fichier journal et de le relire, ou d'avoir python le stocker dans une variable.

Sinon, stderr = sub.STDOUT fusionnera vos erreurs avec la sortie standard. EDIT AGAIN: Ignorez ce qui précède, puisque la fonction communique avec() capture tout cela. Je dirais que le problème est définitivement que le programme que vous avez choisi n'écrit jamais à stderr ou que vous ne déclenchez pas d'erreur. C'est juste la façon dont le programme a été écrit. Quel est le programme?

+0

que suggérez-vous? passé beaucoup de temps à lire; Pourtant, la plupart des points à l'utilisation déconseillée. o.spawn etc. merci d'avance :) –

5

Cela fonctionne parfaitement pour moi:

import subprocess 
try: 
    #prints results 
    result = subprocess.check_output("echo %USERNAME%", stderr=subprocess.STDOUT, shell=True) 
    print result 
    #causes error 
    result = subprocess.check_output("copy testfds", stderr=subprocess.STDOUT, shell=True) 
except subprocess.CalledProcessError, ex: 
    print "--------error------" 
    print ex.cmd 
    print ex.message 
    print ex.returncode 
    print ex.output 
Questions connexes