Python: Geben Sie die Ausgabe von einer Befehlszeile aus, die mit dem Nullpunktausgang beendet wird

Ich verwende Python 2.7.1 auf einem Windows Server 2008 R2 x64-Feld.

Ich versuche, die Ausgabe eines Befehlszeilenprozesses zu erhalten, der einen Nicht-Null-Exit-Status gibt, nachdem er die Informationen ausgegeben hat, die ich benötige.

Ich war zunächst mit subprocess.check_output , und fangen die CalledProcessError, die mit Non-Back-Aus-Status auftritt, aber während der Returncode in den Fehler gespeichert wurde, gab es keine Ausgabe.

Dies läuft gegen Fälle, die Ausgabe geben, aber einen Exit-Status von 0 haben, funktioniert ordnungsgemäß und ich kann die Ausgabe mit subprocess.check_output erhalten.

Meine Annahme war, dass die Ausgabe in STDOUT geschrieben wurde, aber die Ausnahme zieht ihre "Ausgabe" von STDERR. Ich habe versucht, die Funktionalität von check_output umzusetzen, aber ich bekomme immer noch nichts auf die Ausgabe, wenn ich glaube, dass ich die Ausgabe auf STDOUT und STDERR sehen sollte. Mein aktueller Code ist unten (wobei 'Befehl' der Volltext ist, einschließlich der Parameter des Befehls, den ich laufe:

 process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) output = process.communicate() retcode = process.poll() if retcode: raise subprocess.CalledProcessError(retcode, image_check, output=output) return output 

Dies gibt mir folgendes in der Variablenausgabe: [('', None)]

Ist mein subprocess.Popen code korrekt?

    3 Solutions collect form web for “Python: Geben Sie die Ausgabe von einer Befehlszeile aus, die mit dem Nullpunktausgang beendet wird”

    Sie Code funktioniert gut. Stellt sich heraus, dass der Prozess, den Sie anrufen, wahrscheinlich auf CON ausgegeben wird. Siehe folgendes Beispiel

     import subprocess def check_output(command): process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) output = process.communicate() retcode = process.poll() if retcode: raise subprocess.CalledProcessError(retcode, command, output=output[0]) return output command = "echo this>CON" print "subprocess -> " + subprocess.check_output(command, shell=True) print "native -> " + str(check_output(command)) try: subprocess.check_output("python output.py", shell=True) except subprocess.CalledProcessError, e: print "subproces CalledProcessError.output = " + e.output try: check_output("python output.py") except subprocess.CalledProcessError, e: print "native CalledProcessError.output = " + e.output 

    Ausgabe

     subprocess -> native -> ('', None) stderr subproces CalledProcessError.output = stdout native CalledProcessError.output = stderr stdout 

    Leider weiß ich nicht, wie man das Problem lösen kann. Beachten Sie, dass subprocess.check_output Ergebnisse nur die Ausgabe von stdout enthält. Ihr Check_output-Ersatz würde sowohl Stderr als auch Stdout ausgeben.

    Nach der Inspektion von subprocess.check_output , erzeugt es tatsächlich einen CalledProcessError mit der Ausgabe, die nur stdout enthält.

    Hier ist ein Problem, das dich vielleicht treffen könnte – http://bugs.python.org/issue9905

    Haben Sie versucht, stderr=subprocess.STDOUT wie in der python doc Seite erwähnt:

    Um auch den Standardfehler im Ergebnis zu erfassen, verwenden Sie stderr = subprocess.STDOUT:

    Hier ist ein Testcode:

     import subprocess try: subprocess.check_output('>&2 echo "errrrr"; exit 1', shell=True) except subprocess.CalledProcessError as e: print 'e.output: ', e.output try: subprocess.check_output('>&2 echo "errrrr"; exit 1', shell=True, stderr=subprocess.STDOUT) except subprocess.CalledProcessError as e: print 'e.output: ', e.output 

    Ausgabe:

     errrrr e.output: e.output: errrrr 
    Python ist die beste Programmiersprache der Welt.