Python

So führen Sie Shell-Befehle in Python mit der Subprocess Run-Methode aus

So führen Sie Shell-Befehle in Python mit der Subprocess Run-Methode aus
Subprocess ist ein integriertes Python-Modul, das verwendet werden kann, um neue Prozesse zu erstellen und mit ihren Eingabe- und Ausgabedatenströmen zu interagieren. Einfacher ausgedrückt, können Sie damit Shell-Befehle ausführen und ausführbare Binärdateien ausführen, die normalerweise in verschiedenen "bin" -Ordnern über ein Linux-Dateisystem verstreut sind. Sie können auch einen vollständigen Pfad zu einer ausführbaren Binärdatei angeben und alle Befehlszeilenschalter verwenden, die mit der Binärdatei verknüpft sind. In diesem Artikel wird erklärt, wie das Subprocess-Modul und seine run-Methode in Python-Apps verwendet werden. Alle Codebeispiele im Artikel werden mit Python 3 getestet.8.2 auf Ubuntu 20.04.

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 importieren
Teilprozess.run(["cat", "data.TXT"])

Wenn Sie den obigen Code ausführen, wird die folgende Ausgabe zurückgegeben:

name=John
CompletedProcess(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 importieren
Teilprozess.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 importieren
Ausgabe = 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 importieren
Teilprozess.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 importieren
Ausgabe = 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 importieren
Teilprozess.run("cat 'data.txt'", shell=True)

Das Ausführen des obigen Codes erzeugt die folgende Ausgabe:

name=John

Fazit

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.

Battle for Wesnoth-Tutorial
The Battle for Wesnoth ist eines der beliebtesten Open-Source-Strategiespiele, die Sie derzeit spielen können. Dieses Spiel befindet sich nicht nur se...
0 A.D. Lernprogramm
Von den vielen Strategiespielen da draußen, 0 A.D. schafft es, sich trotz Open Source als umfassender Titel und sehr tiefgehendes, taktisches Spiel ab...
Unity3D-Tutorial
Einführung in Unity 3D Unity 3D ist eine leistungsstarke Engine für die Spieleentwicklung. Es ist plattformübergreifend, das heißt, Sie können Spiele ...