Heim >Backend-Entwicklung >Python-Tutorial >Wie kann ich in Python sowohl stdout als auch stderr von einem Unterprozess gleichzeitig auf Dateien und das Terminal umleiten?
Ausgabeumleitung mit Unterprozess in Python: Dateien und Terminal gleichzeitig
Bei der Verwendung der Funktion subprocess.call von Python zum Ausführen mehrerer ausführbarer Dateien wünschen sich Benutzer möglicherweise dass sowohl stdout als auch stderr gleichzeitig in bestimmte Dateien und das Terminal geschrieben werden.
Um dies zu erreichen, kann man statt subprocess.call direkt die Popen-Funktion mit dem Argument stdout=PIPE verwenden. Dies ermöglicht das Lesen von p.stdout:
import sys from subprocess import Popen, PIPE def tee(infile, *files): for line in iter(infile.readline, b""): for f in files: f.write(line) def teed_call(cmd_args, stdout=None, stderr=None): p = Popen( cmd_args, stdout=PIPE if stdout is not None else None, stderr=PIPE if stderr is not None else None ) if stdout is not None: tee(p.stdout, stdout, getattr(sys.stdout, "buffer", sys.stdout)) if stderr is not None: tee(p.stderr, stderr, getattr(sys.stderr, "buffer", sys.stderr)) for t in threads: t.join() return p.wait()
Mit dieser modifizierten Funktion können Benutzer Dateien für stdout und stderr angeben, während sie weiterhin auf dem Terminal drucken. Zum Beispiel:
outf, errf = open("out.txt", "wb"), open("err.txt", "wb") assert not teed_call(["cat", __file__], stdout=None, stderr=errf) assert not teed_call(["echo", "abc"], stdout=outf, stderr=errf, bufsize=0) assert teed_call(["gcc", "a b"], close_fds=True, stdout=outf, stderr=errf)
Das obige ist der detaillierte Inhalt vonWie kann ich in Python sowohl stdout als auch stderr von einem Unterprozess gleichzeitig auf Dateien und das Terminal umleiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!