„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > 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?

Veröffentlicht am 08.11.2024
Durchsuche:680

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 das nutzen stdout=PIPE-Argument zum Lesen aus der Standardausgabe des untergeordneten Prozesses. So geht's:

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()

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

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)
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3