Überprüfen Sie die Ausgabe von CalledProcessError

Ich verwende subprocess.check_output von pythons subprocess module, um einen ping-Befehl auszuführen. Hier ist, wie ich es tue:

output = subprocess.check_output(["ping","-c 2 -W 2","1.1.1.1") 

Es ist ein CalledProcessError und sagt, die Ausgabe ist eines der Argumente der Funktion. Kann mir jemand helfen, wie man diese Ausgabe liest. Ich würde gerne die Ausgabe in einen String lesen und analysieren. Also sagen wir zum Beispiel, wenn der Ping zurückkehrt

100% Paketverlust

Das muss ich einfangen Wenn es irgendeinen anderen besseren Weg gibt. Bitte vorschlagen. Vielen Dank.

  • Probleme mit der Ausgabe von cp-Befehl mit Popen in Python
  • Laufende Liste von cmd.exe Befehlen von maya in Python
  • Ausführen von Befehlen aus Python, die Root-Zugriff benötigen
  • Python-Subprozess-Modul: Looping über Stdout von Child-Prozess
  • Zusammenführen eines Python-Skripts Subprozess "Stdout und Stderr, während sie sie unterscheidbar halten
  • Wie kann ich Subprocess Stdout und Stderr Ausgabe ohne Verzerrung ausdrucken und anzeigen?
  • Vorteil der Liste über String in Unterprozess-Methoden
  • Pythons Subprocess.Popen-Objekt hängt das Sammeln von Child-Ausgabe, wenn der Child-Prozess nicht beendet wird
  • 3 Solutions collect form web for “Überprüfen Sie die Ausgabe von CalledProcessError”

    In der Liste der Argumente muss jeder Eintrag alleine sein. Verwenden

     output = subprocess.check_output(["ping", "-c","2", "-W","2", "1.1.1.1"]) 

    Sollte dein Problem beheben

    Nach der Python- Moduldokumentation ist os.popen seit Python 2.6 veraltet worden.

    Ich denke, die Lösung für moderne Python ist, check_output () aus dem Subprozess-Modul zu verwenden.

    Aus dem Teilprozess Python Dokumentation :

    Subprocess.check_output (args, *, stdin = None, stderr = None, shell = False, universal_newlines = False) Befehl mit Argumenten ausführen und seine Ausgabe als Byte-String zurückgeben

    Wenn der Rückkehrcode ungleich Null war, wird ein CalledProcessError angehoben. Das CalledProcessError-Objekt hat den Rückgabecode im returncode-Attribut und jede Ausgabe im Ausgabeattribut.

    Wenn Sie den folgenden Code in Python 2.7 (oder höher) durchlaufen:

     import subprocess try: print subprocess.check_output(["ping", "-n", "2", "-w", "2", "1.1.1.1"]) except subprocess.CalledProcessError, e: print "Ping stdout output:\n", e.output 

    Sie sollten eine Ausgabe sehen, die so aussieht:

     Ping stdout output: Pinging 1.1.1.1 with 32 bytes of data: Request timed out. Request timed out. Ping statistics for 1.1.1.1: Packets: Sent = 2, Received = 0, Lost = 2 (100% loss), 

    Der e.output String kann analysiert werden, um den OPs zu entsprechen.

    Wenn du den Returncode oder andere Attribute wünschst, sind sie in CalledProccessError, wie man es sehen kann, indem man mit pdb auftritt

     (Pdb)!dir(e) ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getitem__', '__getslice__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__unicode__', '__weakref__', 'args', 'cmd', 'message', 'output', 'returncode'] 

    Thanx @krd, ich benutze deinen Fehlerfangprozess, musste aber die Druck- und Ausnahmeregelungen aktualisieren. Ich verwende Python 2.7.6 unter Linux Mint 17.2.

    Auch war es unklar, woher die Ausgabe-String kam. Mein Update:

     import subprocess # Output returned in error handler try: print("Ping stdout output on success:\n" + subprocess.check_output(["ping", "-c", "2", "-w", "2", "1.1.1.1"])) except subprocess.CalledProcessError as e: print("Ping stdout output on error:\n" + e.output) # Output returned normally try: print("Ping stdout output on success:\n" + subprocess.check_output(["ping", "-c", "2", "-w", "2", "8.8.8.8"])) except subprocess.CalledProcessError as e: print("Ping stdout output on error:\n" + e.output) 

    Ich sehe eine Ausgabe wie folgt:

     Ping stdout output on error: PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data. --- 1.1.1.1 ping statistics --- 2 packets transmitted, 0 received, 100% packet loss, time 1007ms Ping stdout output on success: PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=59 time=37.8 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=59 time=38.8 ms --- 8.8.8.8 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 37.840/38.321/38.802/0.481 ms 
    Python ist die beste Programmiersprache der Welt.