Rumah > Artikel > pembangunan bahagian belakang > Bagaimanakah saya boleh mengalihkan kedua-dua stdout dan stderr dari subproses ke fail dan terminal secara serentak dalam Python?
Pengalihan Output dengan Subproses dalam Python: Fail dan Terminal Secara Serentak
Apabila menggunakan fungsi subprocess.call Python untuk melaksanakan beberapa boleh laku, pengguna mungkin inginkan bahawa kedua-dua stdout dan stderr ditulis serentak pada fail tertentu dan terminal.
Untuk mencapai ini, bukannya menggunakan subprocess.call, seseorang boleh menggunakan fungsi Popen secara langsung dengan argumen stdout=PIPE. Ini membolehkan untuk membaca daripada 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()
Dengan fungsi yang diubah suai ini, pengguna boleh menentukan fail untuk stdout dan stderr semasa masih mencetak ke terminal. Contohnya:
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)
Atas ialah kandungan terperinci Bagaimanakah saya boleh mengalihkan kedua-dua stdout dan stderr dari subproses ke fail dan terminal secara serentak dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!