So führen Sie mit der Subprozess -Auslaufmethode Shell -Befehle in Python aus

So führen Sie mit der Subprozess -Auslaufmethode Shell -Befehle in Python aus
Subprozess ist ein integriertes Python-Modul, mit dem neue Prozesse erstellt und mit ihren Eingabe- und Ausgabedatenströmen interagiert werden können. In einfacheren Worten können Sie es verwenden, um Shell -Befehle auszuführen und ausführbare Binärdateien auszuführen, die normalerweise in verschiedenen „Bin“ -Firmen über ein Linux -Dateisystem verteilt sind. Sie können auch einen vollständigen Pfad für eine ausführbare Binärdatum liefern und alle Befehlszeilenschalter verwenden. In diesem Artikel wird erläutert, wie das Subprozessmodul und seine Run -Methode in Python -Apps verwendet werden. Alle Codeproben im Artikel werden mit Python 3 getestet.8.2 auf Ubuntu 20.04.

Der Subprozess.Methode ausführen

Der Subprozess.Die Auslaufmethode enthält eine Liste von Argumenten. Wenn die Methode aufgerufen wird, führt sie den Befehl aus und wartet, bis der Prozess fertiggestellt wird. Das Objekt „FerasteProcess“ gibt STDOut, STDERR, ursprüngliche Argumente zurück, die beim Aufrufen der Methode verwendet werden, und einen Rückgaberodus. STDOut bezieht sich auf den vom Befehl erstellten Datenstrom, während Stderr auf alle während der Ausführung des Programms angesprochenen Fehler bezieht. Jeder Rückgabecode ungleich Null (Exit-Code) würde einen Fehler bedeuten, wenn der Befehl im Unterprozess ausgeführt wird.Methode ausführen.

Beispiel 1: Ausgabeinhalt einer Textdatei mit dem Subprozess ausgeben.Methode ausführen

Der folgende Befehl gibt den Inhalt einer „Daten aus.txt ”-Datei unter der Annahme, dass sie eine Zeichenfolge„ name = John “enthält.

Subprozess importieren
Subprozess.rennen (["Katze", "Daten.txt"])

Das Ausführen des obigen Codes gibt die folgende Ausgabe zurück:

Name = John
Ferastprozess (args = ['kat', 'Daten.txt '], returnCode = 0)

Das erste Element des Listenarguments ist der Name des zu ausgeführten Befehls. Jedes Element in der Liste, das das erste Element folgt, werden als Befehlszeilenoptionen oder Switches betrachtet. Sie können auch einzelne Armaturenbrett- und Doppelstriche verwenden, um die Optionen zu definieren. Um beispielsweise Dateien und Ordner in einem Verzeichnis aufzulisten, wäre der Code „Subprozess.run (["ls", "-l"] ". In den meisten Fällen können Sie jedes platzgetrennte Argument in einem Shell-Befehl als einzelnes Element in der Liste an den Unterprozess in Betracht ziehen.Methode ausführen.

Beispiel 2: Unterdrückung der Ausgabe von Subprozess.Methode ausführen

Unterdrückung der Ausgabe des Subprozesses.Ausführen der Methode müssen Sie „stdout = subprocess liefern.Devnull “und„ Stderr = Subprozess.Devnull ”als zusätzliche Argumente.

Subprozess importieren
Subprozess.rennen (["Katze", "Daten.txt "], stdout = subprocess.Devnull,
Stderr = Subprozess.Devnull)

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

Ferastprozess (args = ['kat', 'Daten.txt '], returnCode = 0)

Beispiel 3: Erfassungsausgabe von Subprozess.Methode ausführen

Um die Ausgabe des Subprozesses zu erfassen.Verwenden Sie die Methode, verwenden Sie ein zusätzliches Argument mit dem Namen "capture_output = true".

Subprozess importieren
Ausgabe = Subprozess.rennen (["Katze", "Daten.txt "], capture_output = true)
Druck (Ausgabe)

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

Ferastprozess (args = ['kat', 'Daten.txt '], returnCode = 0,
stdout = b'name = John \ n ', stderr = b ")

Sie können einzeln auf STDOut- und STDERR -Werte zugreifen, indem Sie „Ausgabe verwenden.stdout “und„ Ausgabe.Stderr ”Methoden. Der Ausgang wird als Byte -Sequenz erzeugt. Verwenden Sie, um eine Zeichenfolge als Ausgabe zu erhalten, um die Ausgabe zu verwenden.Stdout.decodieren ("utf-8") "Methode. Sie können auch "text = true" als zusätzliches Argument für den Subprozess liefern.Rufen Sie den Anruf aus, um die Ausgabe im String -Format zu erhalten. Um den Bezug -Statuscode zu erhalten, können Sie die Ausgabe verwenden.ReturnCode ”-Methode.

Beispiel 4: Erhöhen Sie die Ausnahme zum Versagen des von Subprozess ausgeführten Befehls.Methode ausführen

Verwenden Sie das Argument "check = true", um eine Ausnahme zu erhalten, wenn der Befehl mit einem Status ungleich Null-Status beendet ist.

Subprozess importieren
Subprozess.rennen (["Katze", "Daten.tx "], capture_output = true, text = true, check = true)

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

Raise Calling Processirror (Retcode, Prozess.Args,
Subprozess.CallingProceserror: Befehl '[' Katze ',' Daten.tx ']'
zurückgegebener Austrittsstatus 1 ungleich Null zurückgegeben.

Beispiel 5: Übergeben Sie eine Zeichenfolge an Befehl, die vom Subprozess ausgeführt wird.Methode ausführen

Sie können eine Zeichenfolge an den Befehl übergeben, der von Subprozess ausgeführt werden soll.Führen Sie die Methode mit "input = 'String" aus.

Subprozess importieren
Ausgabe = Subprozess.run (["cat"], input = "Daten.txt ", capture_output = true,
text = true, check = true)
Druck (Ausgabe)

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

FerastProcess (args = ['cat'], returnCode = 0, stdout = 'Daten.txt ', stderr = ")

Wie Sie sehen können, gibt der obige Code „Daten.txt ”als Zeichenfolge und nicht als Dateiobjekt. Daten übergeben.TXT ”Verwenden Sie als Datei das Argument„ stdin “.

mit offen ("Daten.txt ") als f:
Ausgabe = Subprozess.run (["cat"], stdin = f, capture_output = true,
text = true, check = true)
Druck (Ausgabe)

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

Fertigerprozess (args = ['cat'], returnCode = 0, stdout = 'name = John \ n', stderr = ")

Beispiel 6: Führen Sie den Befehl direkt in der Shell mit dem Subprozess aus.Methode ausführen

Es ist möglich, einen Befehl direkt in eine Shell „wie es“ auszuführen, anstatt einen String -Split in den Hauptbefehl und die folgenden Optionen zu verwenden. Dazu müssen Sie „Shell = True“ als zusätzliches Argument bestehen. Dies wird jedoch von Python -Entwicklern entmutigt, da die Verwendung von „Shell = true“ zu Sicherheitsproblemen führen kann. Von hier aus können Sie mehr über Sicherheitsauswirkungen lesen.

Subprozess importieren
Subprozess.ausführen ("Katzendaten.txt '", Shell = true)

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

Name = John

Abschluss

Der Subprozess.Run -Methode in Python ist ziemlich leistungsfähig, da Sie Shell -Befehle in Python selbst ausführen können. Dies hilft bei der Begrenzung des gesamten Codes auf Python selbst, ohne zusätzlichen Shell -Skriptcode in separaten Dateien zu haben. Es kann jedoch ziemlich schwierig sein, Shell -Befehle in einer Python -Liste korrekt zu tokenisieren. Sie können den „Shlex.split () ”Methode zum Tokenize einfache Shellbefehle, aber in langen, komplexen Befehlen - insbesondere solchen mit Rohrsymbolen - kann Shlex den Befehl nicht korrekt geteilt. In solchen Fällen kann das Debuggen ein schwieriges Thema sein. Mit dieser Aktion können Sie das Argument „Shell = True“ verwenden, um dies zu vermeiden, aber es sind bestimmte Sicherheitsbedenken verbunden.