Wenn Sie Linux verwenden, dann werden Sie die Shell-Befehle bestimmt lieben.
Und wenn Sie mit Python arbeiten, dann haben Sie vielleicht versucht, Dinge zu automatisieren. Das ist eine Möglichkeit, Zeit zu sparen. Vielleicht haben Sie auch einige Bash-Skripte, um Dinge zu automatisieren.
Python ist beim Schreiben von Skripten praktischer als Bash. Und die Verwaltung von Python-Skripten ist im Vergleich zu Bash-Skripten einfach. Sie werden es schwierig finden, die Bash-Skripte zu pflegen, wenn sie einmal gewachsen sind.
Was aber, wenn Sie bereits Bash-Skripte haben, die Sie mit Python ausführen möchten?
Gibt es eine Möglichkeit, die Bash-Befehle und -Skripte in Python auszuführen?
Ja, Python hat ein eingebautes Modul namens Unterprozess die zur Ausführung von Befehlen und Skripten in Python-Skripten verwendet wird. Sehen wir uns nun im Detail an, wie man Bash-Befehle und -Skripte in Python-Skripten ausführt.
Ausführen von Bash-Befehlen
Wie Sie vielleicht schon gesehen haben, ist das Modul Unterprozess wird für die Ausführung von Bash-Befehlen und -Skripten verwendet. Es bietet verschiedene Methoden und Klassen für das gleiche.
Es gibt hauptsächlich eine Methode und eine Klasse, die von der Unterprozess Modul. Sie sind laufen. und Popen. Diese beiden helfen uns, die Bash-Befehle in Python-Skripten auszuführen. Schauen wir sie uns nacheinander an.
subprocess.run()
Die Methode subprocess.run()
nimmt eine Liste von Zeichenketten als Positionsargument an. Diese ist obligatorisch, da sie den Bash-Befehl und dessen Argumente enthält. Das erste Element in der Liste ist der Befehlsname und die übrigen Elemente sind die Argumente für den Befehl.
Sehen wir uns ein kurzes Beispiel an.
import subprocess
subprocess.run(["ls"])
Das obige Skript listet alle Objekte im aktuellen Arbeitsverzeichnis auf, in dem sich das Skript befindet. Im obigen Skript gibt es keine Argumente für den Befehl. Wir haben nur den Bash-Befehl angegeben. Wir können zusätzliche Argumente für den Befehl ls
Befehl wie -l
, -a
, -la
, usw.
Sehen wir uns ein kurzes Beispiel mit Befehlsargumenten an.
import subprocess
subprocess.run(["ls", "-la"])
Der obige Befehl zeigt alle Dateien, einschließlich versteckter Dateien, mit den entsprechenden Berechtigungen an. Wir haben das Argument la
der zusätzliche Informationen zu Dateien und Verzeichnissen sowie versteckte Dateien anzeigt.
Es kann sein, dass wir beim Schreiben der Befehle einige Fehler machen. Die Fehler werden entsprechend den Fehlern angezeigt. Was ist, wenn man sie festhalten und später verwenden möchte? Ja, das können wir mit dem Schlüsselwortargument stderr.
Sehen wir uns ein Beispiel an.
import subprocess
result = subprocess.run(["cat", "sample.txt"], stderr=subprocess.PIPE, text=True)
print(result.stderr)
Vergewissern Sie sich, dass Sie nicht die Datei mit dem Namen beispiel.txt im Arbeitsverzeichnis. Der Wert für das Schlüsselwortargument stderr ist PIPE die dabei hilft, den Fehler in einem Objekt zurückzugeben. Wir können später unter demselben Namen darauf zugreifen. Und das Schlüsselwortargument Text hilft zu erkennen, dass die Ausgabe eine Zeichenkette sein soll.
In ähnlicher Weise können wir die Ausgabe des Befehls mit der Option stdout Schlüsselwort-Argument.
import subprocess
result = subprocess.run(["echo", "Hello, World!"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
print(result.stdout)
subprocess.run() - Eingabe
Sie können den Befehlen Eingaben mit der Eingabe Schlüsselwort-Argument. Wir werden die Eingaben in einem String-Format eingeben. Daher müssen wir das Schlüsselwortargument Text zu True
. Standardmäßig wird sie in Bytes angegeben.
Schauen wir uns ein Beispiel an.
import subprocess
subprocess.run(["python3", "add.py"], text=True, input="2 3")
In dem obigen Programm wird das Python-Skript add.py nimmt zwei Zahlen als Eingabe. Wir haben die Eingabe in das Python-Skript mit dem Befehl Eingabe Schlüsselwort-Argument.
subprocess.Popen()
Die Klasse subprocess.Popen() ist weiter fortgeschritten als die Methode subprocess.run(). Es gibt uns mehr Möglichkeiten, die Befehle auszuführen. Wir erstellen eine Instanz der subprocess.Popen() und für verschiedene Dinge verwenden, wie z.B. den Status der Befehlsausführung zu erfahren, Ausgaben zu erhalten, Eingaben zu machen, usw..,
Es gibt mehrere Methoden der Klasse subprocess.Popen() die wir kennen müssen. Schauen wir sie uns nacheinander zusammen mit den Codebeispielen an.
wait
Er wird verwendet, um zu warten, bis die Ausführung des Befehls abgeschlossen ist. Die nächsten Zeilen des Python-Skripts werden erst nach Beendigung des vorherigen Befehls ausgeführt, der nach dem wait
Methode. Schauen wir uns das Beispiel an.
import subprocess
process = subprocess.Popen(["ls", "-la"])
print("Completed!")
Führen Sie den obigen Code aus und beobachten Sie die Ausgabe. Sie werden sehen, dass die Meldung Abgeschlossen! wird vor der Ausführung des Befehls gedruckt. Wir können dies vermeiden, indem wir die wait
Methode. Warten wir bis zur Fertigstellung des Befehls.
import subprocess
process = subprocess.Popen(["ls", "-la"])
process.wait()
print("Completed!")
Wenn Sie die Ausgabe für den obigen Code sehen, werden Sie feststellen, dass wait
tatsächlich funktioniert. Die Druckanweisung wird nach Abschluss der Befehlsausführung ausgeführt.
communicate
Die Methode communicate
wird verwendet, um die Ausgabe, den Fehler und die Eingabe des Befehls zu erhalten. Er gibt ein Tupel zurück, das die Ausgabe bzw. den Fehler enthält. Lassen Sie uns ein Beispiel sehen.
import subprocess
process = subprocess.Popen(["echo", "Hello, World!"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
result = process.communicate()
print(result)
subprocess.Popen() - Eingabe
Wir können die Eingabe nicht an die Klasse Popen
direkt. Wir müssen das Schlüsselwortargument namens stdin um die Eingabe für den Befehl zu geben. Die Instanz der Klasse Popen
wird uns stdin
Objekt. Es hat eine Methode namens write
die für die Eingabe des Befehls verwendet wird.
Wie bereits erwähnt, werden Eingaben standardmäßig als byteähnliche Objekte angenommen. Vergessen Sie also nicht, das Schlüsselwortargument Text zu True
bei der Erstellung der Instanz von Popen
.
Sehen wir uns ein Beispiel an.
import subprocess
process = subprocess.Popen(["python3", "add.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
process.stdin.write("2 3")
process.stdin.close()
print(process.stdout.read())
poll
Die Methode poll
wird verwendet, um zu prüfen, ob die Ausführung des Befehls abgeschlossen ist oder nicht. Diese Methode gibt zurück None
wenn der Befehl noch ausgeführt wird. Schauen wir uns ein Beispiel an.
import subprocess
process = subprocess.Popen(['ping', '-c 5', 'geekflare.com'], stdout=subprocess.PIPE, text=True)
while True:
output = process.stdout.readline()
if output:
print(output.strip())
result = process.poll()
if result is not None:
break
In dem obigen Code haben wir die ping
Befehl mit 5 Anfragen. Es gibt eine Endlosschleife, die bis zum Abschluss der Befehlsausführung durchläuft. Wir haben die Methode poll
um den Status der Befehlsausführung zu überprüfen. Wenn die Methode poll
gibt einen anderen Code als None
, dann wird die Ausführung abgeschlossen. Und die Endlosschleife bricht ab.
Ausführen von Bash-Skripten
Wir haben zwei Möglichkeiten zur Ausführung der Befehle gesehen. Nun wollen wir sehen, wie man die Bash-Skripte in Python-Skripten ausführt.
Die Unterprozess hat eine Methode namens aufrufen. Diese Methode wird verwendet, um die Bash-Skripte auszuführen. Die Methode gibt den Exit-Code des Bash-Skripts zurück. Der Standard-Exit-Code für die Bash-Skripte ist 0. Sehen wir uns ein Beispiel an.
Erstellen Sie ein Bash-Skript mit dem Namen practice.sh wie folgt.
#!/bin/bash
echo "Hello, World!"
exit 1
Schreiben Sie nun ein Python-Skript, das das obige Bash-Skript ausführt.
import subprocess
exit_code = subprocess.call('./practice.sh')
print(exit_code)
Wenn Sie das obige Python-Skript ausführen, erhalten Sie die folgende Ausgabe.
Hello, World!
1
Schlussfolgerung
Wir haben gesehen, wie man Bash-Befehle und -Skripte in Python ausführt. Sie können sie verwenden, um Dinge effizienter zu automatisieren.
Viel Spaß beim Codieren 👨💻