Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich die Ausgabe von untergeordneten Prozessen in Python gleichzeitig in Dateien und Terminal umleiten?

Wie kann ich die Ausgabe von untergeordneten Prozessen in Python gleichzeitig in Dateien und Terminal umleiten?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-03 19:31:03849Durchsuche

How to Redirect Child Process Output to Files and Terminal Simultaneously in Python?

So geben Sie die Ergebnisse untergeordneter Prozesse gleichzeitig in Dateien und Terminal in Python aus

Bei Verwendung von subprocess.call() ist es möglich, Folgendes anzugeben Dateideskriptoren wie outf und errf, um stdout und stderr auf bestimmte Dateien umzuleiten. Diese Ergebnisse werden jedoch nicht gleichzeitig im Terminal angezeigt.

Lösung mit Popen und Threading:

Um dieses Problem zu lösen, können wir Popen direkt nutzen und nutzen stdout=PIPE-Argument zum Lesen aus der Standardausgabe des untergeordneten Prozesses. So geht's:

<code class="python">import subprocess
from threading import Thread

def tee(infile, *files):
    # Forward output from `infile` to `files` in a separate thread
    def fanout(infile, *files):
        for line in iter(infile.readline, ""):
            for f in files:
                f.write(line)

    t = Thread(target=fanout, args=(infile,) + files)
    t.daemon = True
    t.start()
    return t

def teed_call(cmd_args, **kwargs):
    # Override `stdout` and `stderr` arguments with PIPE to capture standard outputs
    stdout, stderr = [kwargs.pop(s, None) for s in ["stdout", "stderr"]]
    p = subprocess.Popen(
        cmd_args,
        stdout=subprocess.PIPE if stdout is not None else None,
        stderr=subprocess.PIPE if stderr is not None else None,
        **kwargs
    )
    
    # Create threads to simultaneously write to files and terminal
    threads = []
    if stdout is not None:
        threads.append(tee(p.stdout, stdout, sys.stdout))
    if stderr is not None:
        threads.append(tee(p.stderr, stderr, sys.stderr))
        
    # Join the threads to ensure IO completion before proceeding
    for t in threads:
        t.join()

    return p.wait()</code>

Mit dieser Funktion können wir untergeordnete Prozesse ausführen und ihre Ausgabe gleichzeitig in beide Dateien und das Terminal schreiben:

<code class="python">outf, errf = open("out.txt", "wb"), open("err.txt", "wb")
teed_call(["cat", __file__], stdout=None, stderr=errf)
teed_call(["echo", "abc"], stdout=outf, stderr=errf, bufsize=0)
teed_call(["gcc", "a b"], close_fds=True, stdout=outf, stderr=errf)</code>

Das obige ist der detaillierte Inhalt vonWie kann ich die Ausgabe von untergeordneten Prozessen in Python gleichzeitig in Dateien und 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