Geekflare wird von unserem Publikum unterstützt. Es kann sein, dass wir durch den Kauf von Links auf dieser Seite Affiliate-Provisionen verdienen.
Unter Entwicklung Zuletzt aktualisiert: September 14, 2023
Weitergeben:
Invicti Web Application Security Scanner - die einzige Lösung, die eine automatische Überprüfung von Schwachstellen mit Proof-Based Scanning™ ermöglicht.

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 👨‍💻

  • Hafeezul Kareem Shaik
    Autor
Dank an unsere Sponsoren
Weitere gute Lektüre zum Thema Entwicklung
Energie für Ihr Unternehmen
Einige der Tools und Dienste, die Ihr Unternehmen beim Wachstum unterstützen.
  • Invicti nutzt das Proof-Based Scanning™, um die identifizierten Schwachstellen automatisch zu überprüfen und innerhalb weniger Stunden verwertbare Ergebnisse zu erzielen.
    Versuchen Sie Invicti
  • Web Scraping, Residential Proxy, Proxy Manager, Web Unlocker, Search Engine Crawler und alles, was Sie zum Sammeln von Webdaten benötigen.
    Versuchen Sie Brightdata
  • Monday.com ist ein All-in-One-Betriebssystem, mit dem Sie Projekte, Aufgaben, Arbeit, Vertrieb, CRM, Arbeitsabläufe und vieles mehr verwalten können.
    Versuch Montag
  • Intruder ist ein Online-Schwachstellen-Scanner, der Schwachstellen in Ihrer Infrastruktur aufspürt, um kostspielige Datenschutzverletzungen zu vermeiden.
    Versuchen Sie Intruder