Rumah > pembangunan bahagian belakang > Tutorial Python > 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
Lepaskan: 2024-11-04 04:13:01
asal
574 orang telah melayarinya

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()
Salin selepas log masuk

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)
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan