In diesem Artikel besprechen wir Möglichkeiten, wie sich Python-Skripte über ein Bash-Skript ausführen lassen und wie Argumente übermittelt werden können. Das kann in Linux basierten Umgebungen sehr nützlich sein, da wir so die Gelegenheit erhalten, über sogenannte Cronjobs die Ausführung von Python-Programme zu bestimmten Zeiten zu automatisieren.
Bash wird überwiegend in UNIX- und Linux-Umgebungen für die Automatisierung von verschiedenen Aufgaben und Ausführung von Shell-Befehlen verwendet. Python zählt zu einer der beliebtesten Programmiersprachen, die vermehrt in den wissenschaftlichen Bereichen, der Analyse von Daten und in der Entwicklung von künstlicher Intelligenz angewandt wird.
Durch eine Kombination zwischen Shell-Skripts und Python können wir leistungsstarke Programme entwickeln, die viele Aufgaben und Arbeitsabläufe vollständig automatisieren. Uns stehen hierbei, wie so oft in der Programmierung, unterschiedliche Lösungswege zur Verfügung. Einige Techniken, welche die Ausführung von einem Python-Skript aus einem Shell-Skript heraus ermöglichen, zeige ich euch in diesem Tutorial.
Inhaltsverzeichnis: Python-Skripte über die Shell (Bash) ausführen und Abläufe automatisieren
So kann ein Python-Skript über ein Shell-Skript ausgeführt werden
Damit wir ein Python-Skript aus einem Bash-Skript heraus ausführen können, müssen wir zunächst ein neues Skript unter Linux anlegen. Vorwissen in der Shell-Programmierung ist dafür nicht zwingend erforderlich.
Erstelle zunächst ein neues Bash-Skript mit dem VIM- oder Nano-Editor:
nano meinbashskript.sh
Ein Bash-Skript beginnt immer mit der folgenden Zeile:
#!/bin/bash
# Jetzt können wir den Pfad angeben, wo sich das Python-Skript befindet:
cd /home/python/scripts/
# Um ein Skript aus dem oben angegebenen Verzeichnis auszuführen, erweitern wir unser Bash-Skript noch um den folgenden Befehl:
python skript.py
Speichere die Codezeilen ab [STRG + S] und verlasse das Skript wieder [STRG + X]
Das Skript muss jetzt noch ausführbar gemacht werden. Das funktioniert mit dem folgenden Befehl:
chmod +x meinbashskript.sh
Teste mit dem nächsten Befehl, ob das Bash-Skript über die Shell ausgeführt werden kann und validiere anschließend, ob das Python-Skript ordnungsgemäß ausgeführt wurde:
./meinbashskript.sh
Zusammenfassung über das soeben erstellte Bash-Skript
Wir haben in diesem kleinen Skript ein Verzeichnis eingepflegt, indem sich das auszuführende Python-Skript befindet. Sobald wir das Bash-Skript über die Shell ausführen, navigiert das UNIX/Linux System in den zuvor eingepflegten Pfad und führt mit dem Python-Befehl die Skriptdatei selbstständig aus.
Das setzt selbstverständlich voraus, dass die Python-Umgebung und eventuell notwendige Pakete und Abhängigkeiten in Zusammenhang mit dem vorliegenden Python-Skript bereits auf dem Hostsystem installiert wurden.
Argumente an einem Python-Skript aus einem Bash-Skript übermitteln
Es ist nicht nur möglich, Skripte von anderen Programmiersprachen, wie Python aus einem Bash-Skript heraus auszuführen, wir können sogar Argumente und Werte übergeben. Öffnen wir zunächst noch einmal unser Skript aus dem ersten Beispiel, können wir die Argumente übergeben, indem wir hinter dem Befehl für die Ausführung des Python-Skripts mit Dollarzeichen variable Argumente übertragen.
#!/bin/bash
cd /home/python/scripts/
python skript.py $1 $2 $3
Um die Argumente zu importieren, können wir das Sys-Modul verwenden. Innerhalb des Python-Skripts importieren wir das Modul und greifen zunächst auf die Liste der übermittelten Argumente zu:
#Modul importieren:
import sys
#Argumente übergeben:
print("erstes Argument:", sys.argv[1])
print("zweites Argument:", sys.argv[2])
print("drittes Argument:", sys.argv[3])
Im gezeigten Beispiel haben wir mit einer sys.argv-Liste drei verschiedene Befehlszeilenargumente an unserem Python-Programm, direkt aus dem Shell-Skript heraus übermittelt. In der Praxis können wir so auf bestimmte Situationen flexibel reagieren und das Verhalten unseres Programms anpassen.
Über ein Bash-Skript können auch virtuelle Umgebungen für Python-Skripte aktiviert werden
Wer schon länger mit Python arbeitet, weiß, dass virtuelle Umgebungen häufig verwendet werden, um Projektabhängigkeiten zu isolieren und konsistente Laufzeitumgebungen zu gewährleisten. Möchten wir ein bestimmtes Python-Skript in einer virtuellen Umgebung ausführen, können wir die Aktivierung auch über ein Bash-Skript durchführen. Das funktioniert wie folgt.
Erweitere das Shell-Skript mit der folgenden Codezeile:
#!/bin/bash
source /verzeichnis/venv/bin/activate
cd /home/python/scripts/
python skript.py
Das Bash-Skript haben wir jetzt mit dem source-Befehl erweitert, um die virtuelle Umgebung zu aktivieren, noch bevor wir das eigentliche Python-Skript ausführen. Der angegebene Pfad hängt individuell von der eigenen Installation ab, demzufolge habe ich diesen nur „Verzeichnis“ genannt.
Python-Skripte können auch im Hintergrund ausgeführt werden
Arbeiten wir aktiv an einem System oder möchten wir ein Python-Skript über das Bash-Skript ausführen, ohne dass sich das Terminalfenster öffnet und uns bei der Arbeit am System stört, können wir das Python-Skript einfach im Hintergrund ausführen lassen.
Dafür können wir auf den nohup-Befehl zurückgreifen, welcher die Ausgabe direkt umleitet:
#Das Python-Skript im Hintergrund ohne eine Ausgabe ausführen:
nohup python skript.py > /dev/null 2>&1 &
Die Ausgabe wird im Beispiel in die Datei /dev/null umgeleitet, die alle darin geschrieben Daten wieder verwirft. So wird effektiv verhindert, dass die Umleitung der Ausgabe unnötig Speicherplatz beansprucht oder einen anderen laufenden Prozess im Betrieb stört.
Die Ausführung von Programmen im Hintergrund ist immer dann praktisch, wenn es eine fortlaufende Aufgabe mit einer längeren Dauer, wie bei Datenbanken, Webserver und Aufgaben für die Datenverarbeitung. Sich wiederholende Prozesse können jetzt mit einem Cronjob, welchen wir auf das Shell-Skript anwenden können, automatisiert werden.