HOWTO · Python
Python Ein weiteres Python-Skript ausführen
Dieses Tutorial zeigt, wie Sie ein Python-Skript in einem anderen Python-Skript ausführen
Auf dieser Seite
Um Code im selben Python-Prozess wiederzuverwenden, legen Sie ihn in einem Modul ab und importieren Sie dieses. Soll ein weiteres Skript unabhängig laufen, starten Sie mit subprocess einen Kindprozess. Wählen Sie den ersten Ansatz, wenn Sie Funktionen aufrufen oder Objekte gemeinsam nutzen möchten, und den zweiten, wenn das Skript seinen eigenen Prozess und sein eigenes Kommandozeilenverhalten behalten soll.
Mit der Anweisung import ein Python-Skript in einem anderen Python-Skript ausführen
Beim ersten Laden eines Moduls führt Python dessen Anweisungen auf oberster Ebene einmal aus. Legen Sie wiederverwendbare Arbeit in Funktionen und direktes Ausführungsverhalten in einen Block wie if __name__ == "__main__":, damit es nicht allein deshalb ausgeführt wird, weil ein anderes Modul die Datei importiert. Importieren Sie den Modulnamen ohne die Endung .py.
Dieses eigenständige Beispiel erstellt ein Modul in einem temporären Verzeichnis, importiert es und ruft seine Funktion auf:
import importlib
import sys
import tempfile
from pathlib import Path
with tempfile.TemporaryDirectory() as folder:
module_path = Path(folder) / "helper_script.py"
module_path.write_text(
'def greet():\n'
' print("Hello from the helper")\n',
encoding="utf-8",
)
sys.path.insert(0, folder)
try:
helper_script = importlib.import_module("helper_script")
helper_script.greet()
finally:
sys.path.remove(folder)
sys.modules.pop("helper_script", None)
Hello from the helper
In einem Projekt sollte das Hilfsmodul neben dem aufrufenden Skript oder in einem importierbaren Paket liegen. Anweisungen außerhalb von Funktionen und des __main__-Blocks werden beim Import weiterhin ausgeführt. Beschränken Sie den Code auf Modulebene daher auf Definitionen und einmalig gefahrlos ausführbare Einrichtungsschritte.
Mit der Funktion execfile() ein Python-Skript in einem anderen Python-Skript ausführen
execfile() ist eine veraltete Funktion, die den Code einer Datei im aktuellen Interpreter ausführt. Sie kann in älterem Code vorkommen, ist aber nicht in jeder Python-Umgebung verfügbar. Betrachten Sie sie als Kompatibilitätsrisiko und prüfen Sie den im Projekt verwendeten Interpreter, bevor Sie sich darauf verlassen. Die grundlegende Schreibweise lautet execfile("other_script.py").
Python kann mit exec() Quelltext in einem gewählten Namensraum ausführen. exec() ist jedoch kein direkter Ersatz zum Ausführen einer Datei mit execfile(). Wenn Sie eine Datei einlesen und ihren Inhalt an exec() übergeben, ändert sich das Verhalten des Namensraums; eine Prozessisolierung entsteht dadurch nicht. Code aus nicht vertrauenswürdigen Quellen kann beliebigen Python-Code ausführen. Verwenden Sie für wiederverwendbaren Code lieber den Import eines Moduls und für einen separaten Prozess subprocess.
Mit dem Modul subprocess ein Python-Skript in einem anderen Python-Skript ausführen
Verwenden Sie subprocess.run(), wenn das andere Skript als Kindprozess laufen soll. Übergeben Sie die Argumente als Liste und verwenden Sie sys.executable, damit derselbe Python-Interpreter wie im aufrufenden Skript gestartet wird. Dieses Beispiel erstellt ein kleines Skript, startet es als Kindprozess, prüft dessen Rückgabestatus und gibt die aufgezeichnete Ausgabe aus:
import subprocess
import sys
import tempfile
from pathlib import Path
with tempfile.TemporaryDirectory() as folder:
script_path = Path(folder) / "child.py"
script_path.write_text('print("Child process ran")\n', encoding="utf-8")
result = subprocess.run(
[sys.executable, str(script_path)],
check=True,
capture_output=True,
text=True,
)
print(result.stdout, end="")
Child process ran
Übergeben Sie den Skriptpfad als Argument. Verwenden Sie einen absoluten Pfad oder setzen Sie cwd, wenn der Kindprozess ein bestimmtes Arbeitsverzeichnis benötigt. Bei einem erfolglosen Ende des Kindprozesses löst check=True eine CalledProcessError-Ausnahme aus. Lassen Sie die Option weg und prüfen Sie returncode, wenn das aufrufende Skript den Status selbst behandeln soll. Mit capture_output=True können Sie Standardausgabe und Standardfehler lesen, statt sie direkt im Terminal auszugeben.
Mit der Funktion os.system() ein Python-Skript in einem anderen Python-Skript ausführen
os.system() übergibt eine Befehlszeichenfolge an die Shell des Betriebssystems und gibt einen Statuswert zurück. Die Shell interpretiert diese Zeichenfolge, wodurch die korrekte Maskierung und Unterschiede zwischen Plattformen schwer zu handhaben sind. Bauen Sie den Befehl niemals durch Verketten nicht vertrauenswürdiger Eingaben zusammen: Shell-Metazeichen können verändern, was ausgeführt wird. Bevorzugen Sie für neuen Code subprocess.run() mit einer Argumentliste. Damit lassen sich der Status klarer behandeln und Ausgaben bei Bedarf erfassen. Verwenden Sie os.system() hauptsächlich, wenn Sie einfachen älteren Code pflegen, der bereits von einem Shell-Befehl abhängt.
Mit dem Modul importlib ein Python-Skript in einem anderen Python-Skript ausführen
Verwenden Sie importlib.import_module(), wenn der Name des importierbaren Moduls erst zur Laufzeit feststeht. Damit wird ein Modul in den aktuellen Prozess importiert; eine beliebige Datei wird nicht als separater Prozess gestartet. Python muss das Modul über seinen Importpfad finden können. Beim ersten Import werden dessen Anweisungen auf oberster Ebene ausgeführt.
Dieses Beispiel erstellt ein importierbares Modul, wählt dessen Namen dynamisch aus und ruft seine Funktion auf:
import importlib
import sys
import tempfile
from pathlib import Path
with tempfile.TemporaryDirectory() as folder:
module_path = Path(folder) / "task_module.py"
module_path.write_text(
'def run_task():\n'
' print("Task completed")\n',
encoding="utf-8",
)
sys.path.insert(0, folder)
try:
module_name = "task_module"
task_module = importlib.import_module(module_name)
task_module.run_task()
finally:
sys.path.remove(folder)
sys.modules.pop("task_module", None)
Task completed
Bei einem feststehenden Modulnamen ist ein gewöhnlicher import einfacher. Verwenden Sie importlib, wenn der Name tatsächlich von der Laufzeitkonfiguration abhängt, und prüfen Sie, ob das Modul zu den Modulen gehört, die die Anwendung laden darf.
Fazit
Verwenden Sie import, um Funktionen und Daten im aktuellen Prozess wiederzuverwenden, und subprocess, um ein weiteres Skript unabhängig auszuführen. Mit importlib lassen sich Module anhand ihres Namens dynamisch importieren. execfile() ist eine veraltete Funktion, die beim Lesen älteren Codes relevant sein kann; os.system() ruft eine Shell auf und bietet nur begrenzte Kontrolle über den Prozess. Für neue Anwendungen mit separaten Prozessen empfiehlt sich subprocess.run() mit sys.executable und einer Argumentliste.