Der Teilprozess.run-Methode
Der Teilprozess.run-Methode nimmt eine Liste von Argumenten an. Wenn die Methode aufgerufen wird, führt sie den Befehl aus und wartet, bis der Prozess beendet ist, und gibt am Ende ein „CompletedProcess“-Objekt zurück. Das Objekt „CompletedProcess“ gibt stdout, stderr, die beim Aufruf der Methode verwendeten Originalargumente und einen Rückgabecode zurück. Stdout bezieht sich auf den vom Befehl erzeugten Datenstrom, während sich stderr auf alle Fehler bezieht, die während der Ausführung des Programms aufgetreten sind. Jeder Rückgabecode ungleich Null (Exitcode) würde einen Fehler mit dem im Unterprozess ausgeführten Befehl bedeuten.Laufmethode.
Beispiel 1: Ausgabeinhalt einer Textdatei mit dem Unterprozess.run-Methode
Der folgende Befehl gibt den Inhalt eines "data" aus.txt“-Datei, vorausgesetzt, sie enthält einen „name=John“-String.
Unterprozess importierenTeilprozess.run(["cat", "data.TXT"])
Wenn Sie den obigen Code ausführen, wird die folgende Ausgabe zurückgegeben:
name=JohnCompletedProcess(args=['cat', 'data.txt'], Rückgabecode=0)
Das erste Element des Listenarguments ist der Name des auszuführenden Befehls. Jedes Element in der Liste, das dem ersten Element folgt, wird als Befehlszeilenoptionen oder Schalter betrachtet. Sie können auch einzelne Bindestriche und doppelte Bindestriche verwenden, um die Optionen zu definieren. Um beispielsweise Dateien und Ordner in einem Verzeichnis aufzulisten, lautet der Code „subprocess“.run(["ls", "-l"]". In den meisten dieser Fälle können Sie jedes durch Leerzeichen getrennte Argument in einem Shell-Befehl als einzelnes Element in der an den Unterprozess gelieferten Liste betrachten.Laufmethode.
Beispiel 2: Ausgabe des Unterprozesses unterdrücken.run-Methode
So unterdrücken Sie die Ausgabe des Unterprozesses.run-Methode müssen Sie "stdout=subprocess" angeben.DEVNULL“ und „stderr=subprocess“.DEVNULL“ als zusätzliche Argumente.
Unterprozess importierenTeilprozess.run(["cat", "data.txt"], stdout=Unterprozess.DEVNULL,
stderr=Unterprozess.DEVNULL)
Das Ausführen des obigen Codes erzeugt die folgende Ausgabe:
CompletedProcess(args=['cat', 'data.txt'], Rückgabecode=0)Beispiel 3: Ausgabe des Unterprozesses erfassen.run-Methode
So erfassen Sie die Ausgabe des Unterprozesses.run-Methode verwenden, verwenden Sie ein zusätzliches Argument namens „capture_output=True“.
Unterprozess importierenAusgabe = Unterprozess.run(["cat", "data.txt"], capture_output=True)
drucken (Ausgabe)
Das Ausführen des obigen Codes erzeugt die folgende Ausgabe:
CompletedProcess(args=['cat', 'data.txt'], Rückgabecode=0,stdout=b'name=John\n', stderr=b")
Sie können individuell auf stdout- und stderr-Werte zugreifen, indem Sie „output“ verwenden.stdout“ und „output.stderr“-Methoden. Die Ausgabe erfolgt als Bytefolge. Um einen String als Ausgabe zu erhalten, verwenden Sie „output“.stdout.decode(“utf-8”)”-Methode. Sie können dem Unterprozess auch „text=True“ als zusätzliches Argument übergeben.Aufruf ausführen, um die Ausgabe im Zeichenfolgenformat zu erhalten. Um den Exit-Statuscode zu erhalten, können Sie die "Ausgabe" verwenden.Returncode“-Methode.
Beispiel 4: Ausnahme bei Fehler des vom Unterprozess ausgeführten Befehls auslösen Command.run-Methode
Um eine Ausnahme auszulösen, wenn der Befehl mit einem Status ungleich Null beendet wird, verwenden Sie das Argument „check=True“.
Unterprozess importierenTeilprozess.run(["cat", "data.tx"], capture_output=True, text=True, check=True)
Das Ausführen des obigen Codes erzeugt die folgende Ausgabe:
Raise CalledProcessError(recode, process.args,Teilprozess.CalledProcessError: Befehl '['cat', 'data.tx']'
hat einen Exit-Status ungleich Null zurückgegeben 1.
Beispiel 5: Übergeben Sie einen String an den vom Unterprozess ausgeführten Befehl Command.run-Methode
Sie können dem Befehl eine Zeichenfolge übergeben, die vom Unterprozess ausgeführt werden soll.Führen Sie die Methode aus, indem Sie das Argument "input='string'" verwenden.
Unterprozess importierenAusgabe = Unterprozess.run(["cat"], input="data.txt", capture_output=True,
text=wahr, check=wahr)
drucken (Ausgabe)
Das Ausführen des obigen Codes erzeugt die folgende Ausgabe:
CompletedProcess(args=['cat'], returncode=0, stdout="data.txt", stderr=")Wie Sie sehen können, übergibt der obige Code "data".txt“ als String und nicht als Dateiobjekt. „Daten“ übergeben.txt“ als Datei verwenden, verwenden Sie das „stdin“-Argument.
mit open("data.txt") als f:Ausgabe = Unterprozess.run(["cat"], stdin=f, capture_output=True,
text=wahr, check=wahr)
drucken (Ausgabe)
Das Ausführen des obigen Codes erzeugt die folgende Ausgabe:
CompletedProcess(args=['cat'], returncode=0, stdout="name=John\n", stderr=")Beispiel 6: Befehl direkt in der Shell mit dem Unterprozess ausführen.run-Methode
Es ist möglich, einen Befehl direkt in einer Shell „so wie er ist“ auszuführen, anstatt einen String-Split im Hauptbefehl und den darauffolgenden Optionen zu verwenden. Dazu müssen Sie „shell=True“ als zusätzliches Argument übergeben. Dies wird jedoch von Python-Entwicklern abgeraten, da die Verwendung von „shell=True“ zu Sicherheitsproblemen führen kann. Weitere Informationen zu den Auswirkungen auf die Sicherheit finden Sie hier.
Unterprozess importierenTeilprozess.run("cat 'data.txt'", shell=True)
Das Ausführen des obigen Codes erzeugt die folgende Ausgabe:
name=JohnFazit
Der Teilprozess.run-Methode in Python ist ziemlich mächtig, da Sie Shell-Befehle in Python selbst ausführen können. Dies hilft dabei, den gesamten Code auf Python selbst zu beschränken, ohne dass zusätzlichen Shell-Skriptcode in separaten Dateien benötigt wird. Es kann jedoch ziemlich schwierig sein, Shell-Befehle in einer Python-Liste korrekt zu tokenisieren. Sie können die "shlex" verwenden.split()”-Methode, um einfache Shell-Befehle zu tokenisieren, aber in langen, komplexen Befehlen - insbesondere solchen mit Pipe-Symbolen - kann shlex den Befehl nicht korrekt aufteilen. In solchen Fällen kann das Debuggen ein heikles Thema sein. Sie können dies mit dem Argument „shell=True“ vermeiden, aber mit dieser Aktion sind bestimmte Sicherheitsbedenken verbunden.