2009-05-27 2 views
4

Ich habe dies so oft gepostet hier; Es ist jedoch nicht gelungen, absichtliche Fehler vom Befehl zu erfassen. Beste Teilarbeit, die ich bis jetzt gefunden habe.Capture stderr von Python Subprozess.Popen (Befehl, 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

Vielen Dank für Ihre Antwort Spliff vor Ort. Aus Gründen der Klarheit "PyMOTW: subprocess von Doug Hellmann" hier [http://www.oreillynet.com/onlamp/blog/2007/08/pymotw_subprocess_1.html] von Tkinter import * Import subprocess proc = subprocess .Popen ('TestSomeCommandThatDoesNotExisit', Shell = True, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.STDOUT,) stdout_value, stderr_value = proc.communicate() root = Tk() = text Text (root) text.pack() text.insert (END, repr (stdout_value)) root.mainloop() I wurde nicht verschmelzenden stderr = sub.STDOUT Danke nochmal ombre :) ~ nolo –

Antwort

2

Sind Sie 100% sicher, dass 'dattsade' tatsächlich zu stderr schreibt? Wenn ja, puffert es möglicherweise seinen stderr oder blockiert ihn.

EDIT: Ich würde vorschlagen, 'Dattsade' (Ihr Programm) in bash (vorausgesetzt, Sie haben Linux, können Sie dl sh.exe für Windows) und sehen, wenn Sie Ihren stderr zu einer Datei dattdsade 2> Fehler erfassen können .txt. Beachten Sie, dass , wenn Sie unter Windows sind, stderr nicht in einem DOS-Fenster ausgeben wird. Vielleicht haben Sie mehr Glück, wenn Sie zuerst in eine Log-Datei schreiben und sie zurücklesen oder sie in einer Variablen speichern lassen.

Alternativ stderr = sub.STDOUT wird Ihre Fehler mit der stdout zusammenführen.

BEARBEITEN WIEDER: Ignoriere das Obige, da communicate() all dies erfasst. Ich würde sagen, das Problem ist definitiv, dass das Programm, das Sie gewählt haben, niemals in stderr schreibt oder Sie tatsächlich keinen Fehler auslösen. So wurde das Programm geschrieben. Was ist das Programm?

+0

was würden Sie vorschlagen? verbrachte ziemlich viel Zeit beim Lesen; am meisten verweisen jedoch auf veraltete Verwendung. o.spawn etc .. danke im voraus :) –

5

Das funktioniert perfekt für mich:

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