Python-subprocess-Modul

subprocessist ein Modul in der Python-Standardbibliothek, das zum Erstellen und Verwalten von Unterprozessen verwendet wird.

subprocessEs ermöglicht dir, externe Befehle in Python-Programmen auszuführen und mit diesen Befehlen zu interagieren.

Durchsubprocessdem Modul können Sie Systembefehle ausführen, andere Programme aufrufen und deren Ausgabe- oder Fehlermeldungen abrufen.

Warum das subprocess-Modul verwenden?

In Python müssen wir manchmal Systembefehle ausführen oder andere Programme aufrufen, um bestimmte Aufgaben zu erledigen. Zum Beispiel musst du möglicherweise einen Shell-Befehl ausführen, eine externe Anwendung starten oder mit einem Befehlszeilentool interagieren.subprocessDas Modul bietet eine sichere und flexible Möglichkeit, mit diesen Anforderungen umzugehen.

Verglichen mit den früherenos.system()oderos.popen()Ansätzen,subprocessdas Modul bietet leistungsfähigere Funktionalität und bessere Kontrolle. Es ermöglicht dir, die Eingabe-, Ausgabe- und Fehlerströme von Subprozessen feiner zu verwalten und komplexere Szenarien zu bewältigen.


Kernfunktionen des subprocess-Moduls

1. Externe Befehle ausführen

subprocess.run()JasubprocessEine der am häufigsten verwendeten Funktionen im Modul. Sie kann einen externen Befehl ausführen und warten, bis der Befehl abgeschlossen ist. Hier ist ein einfaches Beispiel:

Beispiel

import subprocess

# Führen Sie einen einfachen Shell-Befehl aus
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)

# Geben Sie die Ausgabe des Befehls aus
print(result.stdout)

In diesem Beispiel,subprocess.run()führte denls -lBefehl aus und erfasste die Ausgabe inresult.stdoutdas Ergebnis.

2. Eingabe und Ausgabe verarbeiten

subprocessDas Modul ermöglicht es Ihnen, die Eingabe-, Ausgabe- und Fehlerströme von Subprozessen zu steuern. Sie können Daten an die Standardeingabe eines Subprozesses übergeben oder Daten aus der Standardausgabe und dem Standardfehler eines Subprozesses lesen. Hier ist ein Beispiel:

Beispiel

import subprocess

# Führen Sie einen Befehl aus und übergeben Sie dem Subprozess eine Eingabe
result = subprocess.run(['grep', 'python'], input='hello\npython\nworld', capture_output=True, text=True)

# Geben Sie die Ausgabe des Befehls aus
print(result.stdout)

In diesem Beispiel,subprocess.run()führte dengrep pythonBefehl und übergab die Zeichenfolge'hello\npython\nworld'als Eingabe an den Subprozess.

3. Fehler behandeln

subprocessDas Modul ermöglicht es Ihnen außerdem, Fehler von Subprozessen zu behandeln. Wenn ein Subprozess einen Exit-Status-Code ungleich null zurückgibt,subprocess.run()wird eineCalledProcessErrorAusnahme.result.returncodeSie können prüfen

Beispiel

import subprocess

try:
    result = subprocess.run(['ls', 'nonexistent_file'], capture_output=True, text=True, check=True)
except subprocess.CalledProcessError as e:
    print(f"Command failed with return code {e.returncode}")
    print(f"Error output: {e.stderr}")

Beispielsubprocess.run()In diesem Beispiel,ls nonexistent_fileführte denCalledProcessErrorBefehl. Weil die Datei nicht existiert, ist der Befehl fehlgeschlagen und hat eine


Fortgeschrittene Nutzung des subprocess-Moduls

1. Verwendung der Popen-Klasse

subprocess.Popen1. Verwendung der Popen-KlassePopenDie Klasse bietet eine Schnittstelle auf niedrigerer Ebene, mit der Sie Subprozesse flexibler steuern können. Sie können

Beispiel

import subprocess

Beispiel
process = subprocess.Popen(['ping', 'google.com'], stdout=subprocess.PIPE, text=True)

# Starte einen Subprozess
while True:
    output = process.stdout.readline()
    if output == '' and process.poll() is not None:
        break
    if output:
        print(output.strip())

# Lies die Ausgabe des Subprozesses
return_code = process.poll()
print(f"Prozess beendet mit Rückgabecode {return_code}")

# Exit-Status-Code des Subprozesses abrufensubprocess.PopenIn diesem Beispiel,ping google.comstartete ein

2. Pipes verwenden

subprocess2. Pipes verwenden

Beispiel

import subprocess

Beispiel
p1 = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['grep', 'py'], stdin=p1.stdout, stdout=subprocess.PIPE, text=True)

# Eine Pipe verwenden, um zwei Befehle zu verbinden
output = p2.communicate()[0]
print(output)

# Die endgültige Ausgabe abrufenls -lIn diesem Beispiel,grep pydie Ausgabe des Befehls wird übergeben anpyBefehl, und die endgültige Ausgabe enthält


Übliche Methoden, Klassen und Parameter des subprocess-Moduls

Im Folgenden werden übliche Methoden, Klassen und Parameter des Python-subprocess-Moduls beschrieben, einschließlich Funktionsbeschreibungen und Beispielen:

Kernmethoden des subprocess-Moduls

MethodeBeschreibungBeispiel
subprocess.run()Einen Befehl ausführen und auf den Abschluss warten (empfohlen)subprocess.run(["ls", "-l"], capture_output=True, text=True)
subprocess.Popen()Einen Unterprozess erstellen (Low-Level-Steuerung)proc = subprocess.Popen(["ping", "google.com"], stdout=subprocess.PIPE)
subprocess.call()Einen Befehl ausführen und den Exit-Code zurückgeben (veraltet)exit_code = subprocess.call(["python", "--version"])
subprocess.check_call()Einen Befehl ausführen und bei Fehlschlag eine Ausnahme auslösensubprocess.check_call(["git", "commit"])
subprocess.check_output()Einen Befehl ausführen und die Ausgabe zurückgeben (veraltet)output = subprocess.check_output(["date"], text=True)

Objektattribute von subprocess.CompletedProcess (Rückgabeobjekt der Methode run())

AttributeBeschreibung
argsListe der ausgeführten Befehlsargumente
returncodeExit-Statuscode des Prozesses (0 zeigt Erfolg an)
stdoutInhalt der Standardausgabe (falls gesetztcapture_output)
stderrInhalt der Standardfehlerausgabe (falls gesetztcapture_output)

Gängige Methoden/Attribute der Klasse subprocess.Popen

Methode/AttributBeschreibungBeispiel
poll()Prüfen, ob der Prozess beendet wurde (gibt zurückNoneTrue, um anzuzeigen, dass er läuft)if proc.poll() is None: print("Running")
wait()Blockiert, bis der Prozess endetproc.wait()
communicate()Interaktive Eingabe/Ausgabestdout, stderr = proc.communicate(input="data")
terminate()Terminierungssignal senden (SIGTERM)proc.terminate()
kill()Prozess zwangsweise beenden (SIGKILL)proc.kill()
stdinDer Standardeingabestream des Prozessesproc.stdin.write("input")
stdoutDer Standardausgabestream des Prozessesprint(proc.stdout.read())
stderrDer Standardfehlerstream des Prozesseserrors = proc.stderr.read()

Allgemeine Parameterbeschreibungen (anwendbar auf run() und Popen())

ParameterBeschreibungBeispielwert
argsBefehl (Liste oder Zeichenfolge)["ls", "-l"]oder"ls -l"
stdinKonfiguration der Standardeingabesubprocess.PIPE(pipe),None(inherit)
stdoutKonfiguration der Standardausgabesubprocess.PIPE、open('log.txt', 'w')
stderrKonfiguration der Standardfehlerausgabesubprocess.STDOUT(in stdout zusammengeführt)
shellOb über die Shell ausgeführt wirdTrue(unterstützt Zeichenfolgen-Befehle)
cwdArbeitsverzeichnispfad"/tmp"
envBenutzerdefinierte Umgebungsvariablen{"PATH": "/usr/bin"}
timeoutTimeout (Sekunden)30
textOb Eingabe/Ausgabe ein String ist (nicht Bytes)True

Beispiel

Befehl ausführen und Ausgabe erfassen:

Beispiel

result = subprocess.run(["echo", "Hello"], capture_output=True, text=True)
print(result.stdout)  # Ausgabe: "Hello\n"

Komplexe Befehle über Shell ausführen:

subprocess.run("grep 'error' log.txt | wc -l", shell=True, check=True)
Ausgabestream in Echtzeit abrufen:

Beispiel

proc = subprocess.Popen(["tail", "-f", "log.txt"], stdout=subprocess.PIPE)
while True:
    line = proc.stdout.readline()
    if not line: break
    print(line.decode().strip())

Zeitüberschreitungssteuerung:

Beispiel

try:
    subprocess.run(["sleep", "10"], timeout=5)
except subprocess.TimeoutExpired:
    print("Befehl hat das Zeitlimit überschritten!")
Weitere Erweiterungen