2017-12-29 9 views
1

Ich versuche, einen Code-Making-Code mit Python-Subprozess zu erstellen.Ich möchte überprüfen, ob der Subprozess von Python erfolgreich war oder ob ein Fehler aufgetreten ist

#code = 'print("hey")' #OK 
code = 'print"hey")' #SyntaxError 
with open(filename, 'w') as f: 
    f.write(code) 

proc = s.Popen(['python',filename], stdout=s.PIPE, stderr=s.STDOUT) 
stdout_v, stderr_v = proc.communicate('') 
print(stdout_v.decode('utf8')) 

Es ist ungefähr so.

Derzeit ist der Rückgabewert aus dem Subprozess in stdout_v enthalten, auch wenn er normal arbeitet oder wenn ein Syntaxfehler auftritt, und er kann sie nicht unterscheiden.

Kann ich die Ausgabe erhalten, wenn sie normal ausgeführt wird und eine Fehlermeldung vom Unterprozess erhalten kann, wenn ein Fehler auftritt?

+0

Können Sie Python 3.5+ verwenden? –

+0

Überprüfen Sie 'proc.returncode'. –

+0

BTW - verwenden Sie nicht die "Snippet" -Schaltfläche mit Ausnahme von HTML/JavaScript, die in einem Browser ausgeführt werden kann. Die Taste '{}' sollte verwendet werden, um andere Sprachen zu codieren. –

Antwort

3

Die empfohlene Methode zur Verwendung von Subprozess in Python 3.5+ ist die run function.

proc = s.run(['python',filename], stdout=s.PIPE, stderr=s.PIPE, check=False) 
stdout_v, stderr_v, = proc.stdout, proc.stderr 
return_code = proc.return_code 

Set check=True einen Fehler zu werfen, wenn der Return-Code ungleich Null ist (was ein Anzeichen eines Fehlers geschieht).

In älteren Versionen von Python bevorzugte ich normalerweise, die check_output oder call Funktionen zu verwenden. Check_output gibt einen Fehler aus, wenn ein Beendigungscode ungleich Null erkannt wird, während die Aufruffunktion normal weiterläuft.

+0

Woher bekommen Sie die Behauptung, 'run' sei" der bevorzugte Weg "? Die [Dokumente zum Ersetzen alter Mechanismen durch 'Subprozess'] (https://docs.python.org/2/library/subprocess.html#replacing-older-functions-with-the-subprocess-module) zeigen eine Vielzahl von benutzt, nicht nur 'run'. –

+0

Die Dokumentation für die Funktion run sagt: "Die empfohlene Vorgehensweise zum Aufrufen von Unterprozessen besteht darin, die Funktion run() für alle Anwendungsfälle zu verwenden, die sie verarbeiten kann." –

+0

Ahh. Beachten Sie, dass das Python-3-spezifisch ist. –

0

Aus den Dokumenten

https://docs.python.org/2/library/subprocess.html

Sie können

subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False) 

Run Befehl mit Argumenten für den Befehl Gültigkeit überprüfen. Warten Sie, bis der Befehl abgeschlossen ist. Wenn der Rückkehrcode Null war, dann gebe zurück, sonst calledProcessError. Das CalledProcessError-Objekt enthält den Rückkehrcode im Returncode-Attribut.

Return code 0= Sucess 

Wenn Sie die Ausgabe des Befehls mit Argumenten

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False) 

Befehl Ausführen sehen wollen und dessen Ausgang als Byte-String zurück.

+0

Sie können den Rückkehrcode nicht mit "1" vergleichen, um nach Fehlern zu suchen - alles andere als 0 ist ein Fehler. Außerdem wird das Returncode-Attribut des CalledProcessError nie 0 sein, da es nicht auf Erfolg geworfen wird. Wenn Sie nur nach Erfolg/Misserfolg suchen möchten, ist es nicht sinnvoll, den Returncode zu überprüfen - fangen Sie einfach die Ausnahme ab und behandeln Sie den Fehlerfall dort. – SpoonMeiser

+0

Ich habe den Return-Code 1 = fehlgeschlagen, das war falsch danke für die Eingabe –

Verwandte Themen