>  기사  >  백엔드 개발  >  Python에서 stdout과 stderr을 하위 프로세스에서 파일과 터미널로 동시에 리디렉션하려면 어떻게 해야 합니까?

Python에서 stdout과 stderr을 하위 프로세스에서 파일과 터미널로 동시에 리디렉션하려면 어떻게 해야 합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-04 04:13:01428검색

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이 동시에 지정된 파일과 터미널에 기록됩니다.

이를 달성하려면 subprocess.call을 사용하는 대신 stdout=PIPE 인수와 함께 Popen 함수를 직접 사용할 수 있습니다. 이렇게 하면 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으로 문의하세요.