HOWTO · Python

Subprocess.check_output in Python

Dieses Tutorial behandelt die Verwendung der Funktion subprocess.check_output in Python und konzentriert sich dabei auf die Ausführung von Git-Befehlen. Erfahren Sie, wie Sie Aufgaben automatisieren, Informationen abrufen und die Effizienz Ihres Workflows mit praktischen Beispielen steigern. Entdecken Sie, wie Sie Ihren aktuellen Branch überprüfen, Remotes auflisten und den Status Ihres Repositorys prüfen, während Sie Python und Git nahtlos integrieren.

Auf dieser Seite

subprocess.check_output() führt ein Programm mit den von Ihnen bereitgestellten Argumenten aus und gibt dessen Standardausgabe zurück. Übergeben Sie die Argumente als Liste, um das Ergebnis eines Befehls zu erfassen, ohne einen Shell-Befehlsstring zusammenzusetzen.

Verwendung von subprocess.check_output() in Python

Verwenden Sie subprocess.check_output(), wenn Ihr Skript die Ausgabe eines Befehls benötigt und einen Exit-Status ungleich null als Fehler behandeln soll. Die Funktion ist Teil von Pythons subprocess-Modul; sie führt Befehle nicht parallel aus.

Syntax und Rückgabeverhalten

Eine abgekürzte Aufrufform ist subprocess.check_output(args, *, cwd=..., timeout=..., text=None, ...); dies ist nicht die vollständige Funktionssignatur. args liefert den Befehl und seine Argumente. cwd, timeout und text sind Schlüsselwortargumente: cwd wählt das Arbeitsverzeichnis des Kindprozesses, timeout begrenzt, wie lange der Aufruf wartet, und text steuert, ob die erfasste Ausgabe in Text dekodiert wird. Der Standardwert für text ist None, sodass die Ausgabe Bytes sind, sofern der Textmodus nicht aktiviert ist. Die vollständige API-Referenz finden Sie in der Python-subprocess-Dokumentation.

Standardmäßig ist der Rückgabewert Bytes. Dekodieren Sie ihn, wenn Sie einen Python-String benötigen. Mit text=True dekodiert Python die erfasste Ausgabe für Sie. Dieses kompakte Beispiel lässt den Python-Interpreter eine feste Zeile ausgeben, erfasst die Bytes, dekodiert sie als UTF-8 und schreibt die Zeile in die Standardausgabe.

import subprocess
import sys

output = subprocess.check_output(
    [sys.executable, "-c", "print('ready')"]
)
print(output.decode("utf-8"), end="")
ready

Die Argumentliste hält die ausführbare Datei und ihre Argumente getrennt. Ein Aufruf wie subprocess.check_output(["git", "status"]) erfasst die Standardausgabe von Git im aktuellen Verzeichnis.

Git-Befehle mit subprocess.check_output() ausführen

Führen Sie diese Aufrufe in dem Repository aus, das Sie untersuchen möchten. Um den aktuellen Branch zu lesen, verwenden Sie subprocess.check_output(["git", "rev-parse", "--abbrev-ref", "HEAD"], text=True).strip(). Wenn sich das Repository im Detached-HEAD-Zustand befindet, meldet Git HEAD anstelle eines Branch-Namens.

Um die konfigurierten Remotes und ihre URLs aufzulisten, verwenden Sie subprocess.check_output(["git", "remote", "-v"], text=True). Um gestagte, nicht gestagte und nicht verfolgte Änderungen anzuzeigen, verwenden Sie subprocess.check_output(["git", "status"], text=True). Diese Befehle setzen voraus, dass Git installiert ist und sich das aktuelle Arbeitsverzeichnis innerhalb des vorgesehenen Repositorys befindet; setzen Sie bei Bedarf cwd auf diesen Repository-Pfad.

Fehler behandeln und zwischen check_output() und run() wählen

Wenn der Kindprozess mit einem Status ungleich null endet, löst subprocess.check_output() einen CalledProcessError aus. Sein returncode zeichnet den Exit-Status auf, und sein Attribut output enthält die erfasste Standardausgabe. Die Standardfehlerausgabe wird standardmäßig nicht erfasst; übergeben Sie stderr=subprocess.STDOUT, wenn Sie sie mit der Standardausgabe zusammenführen möchten.

Eine Argumentliste erfordert keine Shell. Vermeiden Sie es, nicht vertrauenswürdige Eingaben über shell=True an einen Befehl zu übergeben, da die Shell-Interpretation eine Befehlsinjektion ermöglichen kann; Shell-Quoting allein ist keine allgemeine Sicherheitslösung.

Wählen Sie subprocess.check_output() für die gezielte Aufgabe, Ausgabe zu erfassen und erfolglose Beendigungen als Fehler zu behandeln. Wählen Sie subprocess.run(), wenn Sie außerdem einen CompletedProcess, mehr Kontrolle über die Standard-Streams oder eine Wahlmöglichkeit im Umgang mit dem Exit-Status benötigen. Beispielsweise gibt subprocess.run(args, capture_output=True, text=True, check=False) den Status und die erfassten Streams zurück, damit Ihr Code sie untersuchen kann.