>  기사  >  백엔드 개발  >  컨텍스트 관리자를 사용하여 Python에서 stdout/stderr을 일시적으로 리디렉션하는 방법은 무엇입니까?

컨텍스트 관리자를 사용하여 Python에서 stdout/stderr을 일시적으로 리디렉션하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-31 00:28:03565검색

How to Temporarily Redirect stdout/stderr in Python with a Context Manager?

일시적으로 stdout/stderr 리디렉션, 재검토

stdout/stderr을 외부 파일로 리디렉션하는 것이 일반적이지만 범위 내에서 임시로 리디렉션해야 할 수도 있습니다.

현재 솔루션의 한계

기존 솔루션은 일반적으로 전체 출력 스트림을 대체하므로 이러한 스트림의 로컬 복사본은 영향을 받지 않습니다. 이로 인해 메서드가 스트림의 로컬 복사본을 사용할 때 문제가 발생할 수 있습니다.

ContextManager 솔루션

이 제한 사항을 해결하기 위해 contextmanager를 사용하여 리디렉션 논리를 구현할 수 있습니다.

<code class="python">import os
import sys

class RedirectStdStreams(object):
    def __init__(self, stdout=None, stderr=None):
        self._stdout = stdout or sys.stdout
        self._stderr = stderr or sys.stderr

    def __enter__(self):
        self.old_stdout, self.old_stderr = sys.stdout, sys.stderr
        self.old_stdout.flush(); self.old_stderr.flush()
        sys.stdout, sys.stderr = self._stdout, self._stderr

    def __exit__(self, exc_type, exc_value, traceback):
        self._stdout.flush(); self._stderr.flush()
        sys.stdout = self.old_stdout
        sys.stderr = self.old_stderr</code>

이 클래스는 stdout과 stderr 모두의 임시 리디렉션을 허용합니다.

사용 예

사용 방법을 보여주기 위해 출력을 /dev/null로 리디렉션하고 동작을 관찰할 수 있습니다.

<code class="python">if __name__ == '__main__':

    devnull = open(os.devnull, 'w')
    print('Fubar')

    with RedirectStdStreams(stdout=devnull, stderr=devnull):
        print("You'll never see me")

    print("I'm back!")</code>

이 예에서는 리디렉션이 활성화된 동안 "You'll never see me"라는 메시지가 표시되지 않지만 나중에 표시되어 리디렉션이 일시적이고 컨텍스트 관리자 내의 범위에만 영향을 미친다는 것을 확인합니다.

위 내용은 컨텍스트 관리자를 사용하여 Python에서 stdout/stderr을 일시적으로 리디렉션하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.