Gibt den Wert aus dem Python-Subprozess zurück

8

Ich möchte die Ausgabe (print-Anweisungen) erhalten und den Status von einem Python-Subprozess zusammen mit der Anzeige von Protokollinformationen zurückgeben. Ich verwende Python 2.5 unter Windows XP. Wie bekomme ich auch den Rückgabecode? Hier in diesem Auszug lese ich die Ausgabe, so dass ich sie so umleiten kann, dass sie in einem separaten Thread in einem wxPython TextCtrl angezeigt wird.

%Vor%     
user974168 09.11.2011, 05:46
quelle

1 Antwort

7

Der Rückkehrcode wird vom poll -Aufruf zurückgegeben und ist auch (über% poll ) zugänglich, wenn None über das returncode -Attribut zurückgegeben wurde. Du verwendest das bereits in deinem Code, also bin ich mir nicht sicher, was dein Problem damit ist.

Wenn Sie Ihr Steuerelement während der Ausführung Ihres Prozesses aktualisieren möchten, verwenden Sie readline anstelle von read : Letzteres wartet auf die gesamte Ausgabe, während die erstere auf ein Zeilenumbruchzeichen wartet. Um ein vollständiges Beispiel mit Ihren Variablennamen zu geben:

%Vor%

Beachten Sie, dass Sie .strip() das readline -Ergebnis möchten, da es das Zeilenumbruchzeichen enthält.

Bearbeiten: Um die Verwirrung zwischen der Skriptausgabe und dem Rückgabecode zu beheben, gehen Sie wie folgt vor. Erstens kann ein Python-Skript auf Modulebene keinen Wert zurückgeben: das würde einen Syntaxfehler ergeben. Was Sie also unterscheiden sollten, ist die Ausgabe des Skripts und der zurückgegebene Code.

Die Ausgabe des Skripts wird im obigen Beispiel mit der Methode self.myproc.stdout.readline gelesen. Jedes Mal, wenn der externe Prozess eine Zeile mit ausgegebenem Text erzeugt hat, würde der Aufruf dieser Funktion ihn abrufen.

Der Rückgabecode (oder Exit-Status) ist jedoch eine Ganzzahl, die von einem untergeordneten Prozess an den übergeordneten (Ihr) Prozess übergeben wird und den Status angibt, in dem der untergeordnete Prozess beendet wurde. In Python machen Sie das mit der Funktion sys.exit . Wenn dieser Wert 0 ist, zeigt er meistens Erfolg an; Ein Wert ungleich Null zeigt eine Art von Fehler.

Sagen Sie, Ihr Kindprozessskript sieht so aus:

%Vor%

Führt man diese externe Datei (nennen wir sie test.py ) mit der Klasse Popen aus, erhalten wir pass , wenn wir self.myproc.stdout auslesen, und 0 , wenn wir self.myproc.poll (oder self.myproc.returncode nach der ersten Umfrage).

Der Zweck dieses Rückgabecodes besteht darin, dass Sie nicht alle Ausgaben des untergeordneten Prozesses analysieren müssen, um festzustellen, ob der Job erfolgreich war: Sie können Ihre eigenen Beendigungscodes definieren. Zum Beispiel könnten Sie 0 als Erfolg, 1 als Fehler, 2 als eine ungültige Eingabe, 9 als unbekannten Fehler und so weiter ansehen. Auf diese Weise können Sie poll den Prozess beibehalten und basierend auf dem Exit-Code, der von dieser Umfrage zurückgegeben wird, wissen Sie direkt, ob es erfolgreich war. Beachten Sie, dass dies in Ihrem Fall etwas weniger anwendbar ist, da Sie die Ausgabe des untergeordneten Prozesses trotzdem benötigen. Dennoch ist es einfacher, eine Zahl zu analysieren als eine Zeichenfolge, um den Erfolg zu bestimmen.

    
jro 09.11.2011, 08:02
quelle

Tags und Links