Ü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

  • Warum bekomme ich ELIF ungültige Syntax?
  • Rückkehr von einzigartigen Streichhölzern mit Regex in Python
  • Wie kann ich Schlüsselwörter aus einem Python-Format-String extrahieren?
  • Django: Wie man Anfangswerte für ein Feld in einem Inline-Modell-Formset festlegt?
  • HeartBleed Python-Test-Skript
  • Netbeans 7.1 und python
  • 100% Paketverlust

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

  • Immer Ceil () von Dezimal in Python?
  • Wie kann ich meine Matplotlib-Figur dynamisch aktualisieren, wenn sich die Datendatei ändert?
  • Zeitreihenprognose mit wiederkehrendem Elman-Netzwerk in Neurolab
  • Python-Quellcode für eingebauten "In" -Operator
  • Windows 7 64bit libsvm und python error: function 'svm_get_sv_indices' nicht foud
  • Eine invertierte vertikale Datumsachse anzeigen
  • 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.