Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich in Python sowohl stdout als auch stderr von einem Unterprozess gleichzeitig auf Dateien und das Terminal umleiten?

Wie kann ich in Python sowohl stdout als auch stderr von einem Unterprozess gleichzeitig auf Dateien und das Terminal umleiten?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-04 04:13:01428Durchsuche

How can I redirect both stdout and stderr from a subprocess to files and the terminal simultaneously in Python?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn