Wie führe ich Bash-Skripte mit Python aus?

Wenn Sie Linux verwenden, werden 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 praktischer, um Skripte zu schreiben als Bash. Und die Verwaltung von Python-Skripten ist im Vergleich zu Bash-Skripten einfach. Sie werden es schwierig finden, die Bash-Skripte zu warten, sobald sie 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 subprocess, das verwendet wird, um die Befehle und Skripte in Python-Skripten auszuführen. Sehen wir uns an, wie Bash-Befehle und -Skripte in Python-Skripten im Detail ausgeführt werden.

Ausführen von Bash-Befehlen

Wie Sie vielleicht bereits gesehen haben, wird der Modul-Unterprozess 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, die man aus dem subprocess-Modul kennen sollte. Sie werden ausgeführt und Popen. Diese beiden helfen uns, die Bash-Befehle in Python-Skripten auszuführen. Sehen wir sie uns nacheinander an.

subprocess.run()

Die Methode subprocess.run() nimmt eine Liste von Strings als Positionsargument. Dies ist obligatorisch, da es den Bash-Befehl und Argumente dafür enthält. Das erste Element in der Liste ist der Befehlsname und die verbleibenden 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, während das Skript liegt. Es gibt keine Argumente für den Befehl im obigen Skript. Wir haben nur den bash-Befehl gegeben. Wir können dem ls-Befehl zusätzliche Argumente wie -l, -a, -la usw.

  Die 15 besten Spesenverfolgungs-/Verwaltungssoftware für kleine und mittelständische Unternehmer

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 zusammen mit den Berechtigungen an. Wir haben das Argument la bereitgestellt, das zusätzliche Informationen zu Dateien und Verzeichnissen sowie versteckte Dateien anzeigt.

Wir können beim Schreiben der Befehle einige Fehler machen. Fehler werden entsprechend den Fehlern erhoben. Was ist, wenn Sie sie erfassen und später verwenden möchten? Ja, das können wir mit dem Schlüsselwortargument stderr machen.

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 sample.txt nicht im Arbeitsverzeichnis haben. Der Wert für das Schlüsselwortargument stderr ist PIPE, was hilft, den Fehler in einem Objekt zurückzugeben. Wir können später mit demselben Namen darauf zugreifen. Und das Schlüsselwortargument text hilft zu sagen, dass die Ausgabe ein String sein sollte.

Auf ähnliche Weise können wir die Ausgabe des Befehls mit dem Schlüsselwortargument stdout erfassen.

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 dem Schlüsselwort-Argument input geben. Wir werden Eingaben in einem String-Format geben. Also müssen wir den Text des Schlüsselwortarguments auf True setzen. Standardmäßig nimmt es es in Bytes.

Schauen wir uns ein Beispiel an.

import subprocess
subprocess.run(["python3", "add.py"], text=True, input="2 3")

Im obigen Programm nimmt das Python-Skript add.py zwei Zahlen als Eingabe. Wir haben die Eingabe an das Python-Skript mit dem Schlüsselwort-Argument input übergeben.

Unterprozess.Popen()

Die Klasse subprocess.Popen() ist fortgeschrittener als die Methode subprocess.run(). Es gibt uns mehr Optionen, um die Befehle auszuführen. Wir erstellen eine Instanz von subprocess.Popen() und verwenden sie für verschiedene Dinge, z. B. um den Status der Befehlsausführung zu kennen, Ausgaben zu erhalten, Eingaben zu machen usw.,

  16 Bester Rechnungsgenerator zum Akzeptieren von Zahlungen

Es gibt mehrere Methoden der Klasse subprocess.Popen(), die wir kennen 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 nach Abschluss des vorherigen Befehls ausgeführt, der nach der Wait-Methode geschrieben wurde. Sehen 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 ausgegeben. Wir können dies mit der Wait-Methode vermeiden. Warten wir, bis der Befehl abgeschlossen ist.

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.

kommunizieren

Die Methode communication wird verwendet, um die Ausgabe und den Fehler abzurufen und Eingaben für den Befehl zu machen. 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)

subprocess.Popen() – Eingabe

Wir können die Eingabe nicht direkt an die Klasse Popen übergeben. Wir müssen das Schlüsselwortargument namens stdin verwenden, um die Eingabe für den Befehl zu geben. Die Instanz der Klasse Popen liefert uns ein stdin-Objekt. Es hat eine Methode namens write, die verwendet wird, um die Eingabe für den Befehl zu geben.

Wie wir bereits besprochen haben, werden Eingaben standardmäßig als Byte-ähnliche Objekte akzeptiert. Vergessen Sie also nicht, den Text des Schlüsselwortarguments auf True zu setzen, während Sie die Instanz von Popen erstellen.

  4 Krimiserienspiele zum Ausprobieren

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

Mit der Methode poll wird überprüft, ob die Ausführung des Befehls abgeschlossen ist oder nicht. Diese Methode gibt None zurück, 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 den Ping-Befehl mit 5 Anfragen verwendet. Es gibt eine Endlosschleife, die bis zum Abschluss der Befehlsausführung iteriert. Wir haben die Methode poll verwendet, um den Status der Befehlsausführung zu überprüfen. Wenn die Methodenabfrage einen anderen Code als None zurückgibt, wird die Ausführung abgeschlossen. Und die Endlosschleife bricht.

Ausführen von Bash-Skripten

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.

Der Unterprozess hat eine Methode namens call. Diese Methode wird verwendet, um die Bash-Skripte auszuführen. Die Methode gibt den Exit-Code 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 Programmieren 👨‍💻