Heim > Artikel > Backend-Entwicklung > Wie kann ich die Ausgabe von untergeordneten Prozessen in Python gleichzeitig in Dateien und Terminal umleiten?
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!