Python subprocess.Popen.wait () gibt 0 zurück, obwohl ein Fehler aufgetreten ist

Ich laufe ein Kommandozeilen-Dienstprogramm über Pythons Subprozess-Modul. Ich schaffe ein subprocess.Popen () – Objekt mit den Befehlszeilenargumenten und stdout = subprocess.PIPE und dann verwende ich subprocess.wait (), um zu warten, bis die Aufgabe abgeschlossen ist und den Returncode zurückgibt, der angeben sollte, ob die Aufgabe erfolgreich abgeschlossen wurde .

translate = subprocess.Popen(['gdal_translate', '-of', 'HFA', 'inDataset', 'outDataset'], stdout=subprocess.PIPE) if translate.wait() == 0: print "Success" else: print "Fail - %s" % translate.stdout.read() 

Wenn ich mein Skript in der Windows-Eingabeaufforderung ausführe, kann ich die von gdal_translate bereitgestellten Nachrichten sehen und sie sagen, dass es Fehler gibt, die einen Prozess zum Ausfall verursachen, aber mein Skript druckt immer noch "Erfolg".

Wie kann ich nach Fehlern fragen, die vom Kommandozeilen-Dienstprogramm gemeldet werden, wenn der Rückkehrcode immer 0 ist?

  • Python, Installation clarifai -> VS14.0 link.exe fehlgeschlagen mit Exit-Status 1158
  • Die Eingabe der Befehlszeile in Python
  • Implementieren eines "[Befehls] [Aktion] [Parameter]" Stil Befehlszeilen-Schnittstellen?
  • Vervollständigen Sie als-Sie-Typ auf Befehlszeile mit Python
  • Python-Befehlszeilenparameter
  • Unterschied zwischen "Inspektion" und "interaktiven" Kommandozeilen-Flags in Python
  • One Solution collect form web for “Python subprocess.Popen.wait () gibt 0 zurück, obwohl ein Fehler aufgetreten ist”

    Es ist möglich, dass man Fehler bekommt und immer noch einen Rückkehrcode von Null hat. In deinem Code erfassst du nur Standard und kein Standardfehler. In der Run-Funktion unten wird ein Befehl ausgeführt, warten auf die Ausführung zu beenden, dann lesen Sie die Returncode Standard-Fehler und Standard-Ausgabe. Wenn es irgendetwas auf Standardfehler gibt oder wenn returncode nicht Null ist, dann wird es das als ein Fehler behandeln. Sie können die vier Beispielaufrufe im Code sehen. Der erste ist ein normaler erfolgreicher Anruf, der zweite hat den Rücksendecode 0, hat aber bei Fehler und Standardausgabe ausgegeben. Die dritte hat einen Nullpunkt-Rückkehrcode und Fehlerausgabe, während das letzte Beispiel einen Nicht-Null-Return-Code ohne Ausgabe hat.

    Code

     from subprocess import Popen, PIPE def run(cmd): print '-'*40 print 'running:', cmd p = Popen(cmd, stderr=PIPE, stdout=PIPE, shell=True) output, errors = p.communicate() print [p.returncode, errors, output] if p.returncode or errors: print 'something went wrong...' run("echo all is well") run("echo out;echo error 1>&2") run("this-will-fail") run("exit 1") 

    Ausgabe

     ---------------------------------------- running: echo all is well [0, '', 'all is well\n'] ---------------------------------------- running: echo out;echo error 1>&2 [0, 'error\n', 'out\n'] something went wrong... ---------------------------------------- running: this-will-fail [127, '/bin/sh: this-will-fail: not found\n', ''] something went wrong... ---------------------------------------- running: exit 1 [1, '', ''] something went wrong... 
    Python ist die beste Programmiersprache der Welt.