Wenn Sie Linux verwenden, würden Sie die Shell-Befehle definitiv lieben.
Und wenn Sie mit Python arbeiten, haben Sie vielleicht versucht, Dinge zu automatisieren. Das ist eine Möglichkeit, Zeit zu sparen. Möglicherweise haben Sie auch einige Bash-Skripte, um Dinge zu automatisieren.
Python ist praktisch, Skripte als Bash zu schreiben. 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 wachsen.
Aber was ist, 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 verwendet wird, um die Befehle und Skripte in Python-Skripten auszuführen. Sehen wir uns im Detail an, wie Sie Bash-Befehle und -Skripte in Python-Skripten ausführen.
Executing Bash Commands
Wie Sie das Modul vielleicht schon gesehen haben Unterprozess wird verwendet, um die Bash-Befehle und -Skripte auszuführen. Es bietet verschiedene Methoden und Klassen für dasselbe.
Es gibt hauptsächlich eine Methode und eine Klasse, über die Sie Bescheid wissen sollten Unterprozess Modul. Sie sind Lauf und Popen. Diese beiden helfen uns, die Bash-Befehle in Python-Skripten auszuführen. Sehen wir sie uns einzeln an.
Unterprozess.run()
Das Verfahren subprocess.run()
nimmt eine Liste von Strings als Positionsargument. Dies ist obligatorisch, da es den bash-Befehl und die entsprechenden Argumente enthält. Das erste Element in der Liste ist der Befehlsname und die restlichen 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 Elemente im aktuellen Arbeitsverzeichnis auf, wie das Skript liegt. Im obigen Skript gibt es keine Argumente für den Befehl. Wir haben nur den bash-Befehl gegeben. Wir können zusätzliche Argumente für die 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 der versteckten Dateien zusammen mit den Berechtigungen an. Wir haben das Argument geliefert la
die zusätzliche Informationen zu Dateien und Verzeichnissen und versteckte Dateien anzeigt.
Es kann sein, dass wir beim Schreiben der Befehle einige Fehler machen. Fehler werden entsprechend den Fehlern erhöht. Was ist, wenn Sie sie erfassen und später verwenden möchten? Ja, das können wir mit dem Schlüsselwortargument machen stderr.
Sehen wir uns ein Beispiel an.
import subprocess
result = subprocess.run(["cat", "sample.txt"], stderr=subprocess.PIPE, text=True)
print(result.stderr)
Stellen Sie sicher, dass Sie die Datei mit dem Namen nicht haben Beispiel.txt im Arbeitsverzeichnis. Der Wert für das Schlüsselwortargument stderr is ROHR was 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 ein String sein sollte.
Auf ähnliche Weise können wir die Ausgabe des Befehls mit der stdout Stichwort 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 die Befehle eingeben, indem Sie die Eingabe Stichwort Argument. Wir geben Eingaben in einem String-Format. Also müssen wir das Schlüsselwortargument setzen Text zu True
. Standardmäßig nimmt es in Bytes an.
Schauen wir uns ein Beispiel an.
import subprocess
subprocess.run(["python3", "add.py"], text=True, input="2 3")
Im obigen Programm das Python-Skript add.py nimmt zwei Zahlen als Eingabe. Wir haben die Eingabe in das Python-Skript mit dem Eingabe Stichwort Argument.
Unterprozess.Popen()
Die Klasse Unterprozess.Popen() ist fortgeschrittener als die Methode Unterprozess.run(). Es gibt uns mehr Möglichkeiten, die Befehle auszuführen. Wir erstellen eine Instanz des Unterprozess.Popen() und verwenden Sie es für verschiedene Dinge, wie den Status der Befehlsausführung zu kennen, Ausgaben zu erhalten, Eingaben zu geben usw.,
Es gibt mehrere Methoden der Klasse Unterprozess.Popen() die wir wissen müssen. Sehen wir sie uns nacheinander zusammen mit den Codebeispielen an.
warten
Es wird verwendet, um zu warten, bis die Ausführung des Befehls abgeschlossen ist. Die nächsten Zeilen des Python-Skripts werden erst ausgeführt, wenn der vorherige Befehl abgeschlossen ist, der nach dem geschrieben wird written wait
Methode. Sehen wir uns das Beispiel an.
import subprocess
process = subprocess.Popen(["ls", "-la"])
print("Completed!")
Führen Sie den obigen Code aus und beobachte die Ausgabe. Sie werden sehen, dass die Nachricht Abgeschlossen! wird vor der Ausführung des Befehls gedruckt. Wir können es vermeiden, indem wir die wait
Methode. Warten wir bis zum Abschluss 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
funktioniert tatsächlich. Die print-Anweisung wird nach Abschluss der Befehlsausführung ausgeführt.
mit uns kommunizieren,
Das Verfahren communicate
wird verwendet, um die Ausgabe, den Fehler und die Eingabe des Befehls zu erhalten. Es gibt ein Tupel zurück, das Ausgabe bzw. Fehler enthält. Sehen wir uns ein Beispiel an.
import subprocess
process = subprocess.Popen(["echo", "Hello, World!"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
result = process.communicate()
print(result)
Unterprozess.Popen() – Eingabe
Wir können die Eingabe nicht an die Klasse übergeben Popen
direkt. Wir müssen das Schlüsselwortargument namens . verwenden Standard um die Eingabe für den Befehl zu geben. Die Instanz der Klasse Popen
wird uns zur Verfügung stellen stdin
Objekt. Es hat eine Methode namens write
die verwendet wird, um die Eingabe an den Befehl zu geben.
Wie bereits erwähnt, werden Eingaben standardmäßig als byteähnliche Objekte angenommen. Vergessen Sie also nicht, das Schlüsselwortargument festzulegen Text zu True
beim Erstellen 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())
Umfrage
Das Verfahren poll
wird verwendet, um zu überprüfen, ob die Ausführung des Befehls abgeschlossen ist oder nicht. Diese Methode wird zurückkehren None
wenn der Befehl noch ausgeführt wird. Sehen 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
Im obigen Code haben wir die ping
Befehl mit 5 Anfragen. Es gibt eine Endlosschleife, die bis zum Abschluss der Befehlsausführung iteriert. Wir haben die Methode verwendet poll
um den Status der Befehlsausführung zu überprüfen. Wenn die Methode poll
gibt einen anderen Code zurück als None
, dann ist die Ausführung abgeschlossen. Und die Endlosschleife bricht ab.
Executing Bash Scripts
Wir haben zwei Möglichkeiten gesehen, die Befehle auszuführen. Sehen wir uns nun an, wie die Bash-Skripte in Python-Skripten ausgeführt werden.
Die Unterprozess hat eine Methode namens rufen Sie Zoe an. Diese Methode wird verwendet, um die Bash-Skripte auszuführen. Die Methode gibt den Exitcode aus dem Bash-Skript zurück. Der Standard-Exit-Code für die Bash-Skripte ist 0. Sehen wir uns ein Beispiel an.
Erstellen Sie wie folgt ein Bash-Skript mit dem Namen practice.sh.
#!/bin/bash
echo "Hello, World!"
exit 1
Schreiben Sie nun ein Python-Skript, führen Sie das obige Bash-Skript aus.
import subprocess
exit_code = subprocess.call('./practice.sh')
print(exit_code)
Sie erhalten die folgende Ausgabe, sobald Sie das obige Python-Skript ausführen.
Hello, World!
1
Fazit
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 👨💻