首頁  >  文章  >  後端開發  >  如何在 Python 中同時將 stdout 和 stderr 從子程序重新導向到檔案和終端?

如何在 Python 中同時將 stdout 和 stderr 從子程序重新導向到檔案和終端?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-04 04:13:01484瀏覽

How can I redirect both stdout and stderr from a subprocess to files and the terminal simultaneously in Python?

Python 中子程序的輸出重定向:檔案和終端同時進行

當使用Python 的subprocess.call 函數執行多個可執行檔案時,使用者可能希望stdout 和stderr 同時寫入指定檔案和終端。

實作這樣,可以直接使用帶有 stdout=PIPE 參數的 Popen 函數,而不是使用 subprocess.call。這允許從 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()

使用此修改後的函數,使用者可以為 stdout 和 stderr 指定文件,同時仍列印到終端。例如:

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)

以上是如何在 Python 中同時將 stdout 和 stderr 從子程序重新導向到檔案和終端?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn