Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah saya boleh mengalihkan kedua-dua stdout dan stderr dari subproses ke fail dan terminal secara serentak dalam Python?

Bagaimanakah saya boleh mengalihkan kedua-dua stdout dan stderr dari subproses ke fail dan terminal secara serentak dalam Python?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-04 04:13:01428semak imbas

How can I redirect both stdout and stderr from a subprocess to files and the terminal simultaneously in 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn