>  기사  >  백엔드 개발  >  Python 메서드에서 stdout 및 stderr을 일시적으로 리디렉션하는 방법은 무엇입니까?

Python 메서드에서 stdout 및 stderr을 일시적으로 리디렉션하는 방법은 무엇입니까?

DDD
DDD원래의
2024-10-28 12:09:01463검색

How to Temporarily Redirect stdout and stderr in Python Methods?

stdout 및 stderr 임시 리디렉션

특히 Python에서 메서드가 지속되는 동안 stdout 및 stderr을 임시로 리디렉션할 수 있습니까?

기존 솔루션의 함정:

CurrentUserSolutions는 안타깝게도 스트림을 실제로 리디렉션하지 않습니다. 대신에 단순히 완전히 교체합니다. 그러나 메소드가 두 스트림 중 하나의 로컬 복사본을 보유하는 경우(예를 들어 매개변수로 사용하기 때문에) 이 접근 방식은 실패합니다.

Context Manager 기반 솔루션:

컨텍스트 관리자 내에서 리디렉션 논리를 캡슐화하면 이 문제가 해결됩니다. 예는 다음과 같습니다.

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

class RedirectStdStreams:
    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

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>

예에 표시된 대로 사용하면 이 컨텍스트 관리자는 일시적으로 stdout 및 stderr을 /dev/null로 리디렉션하여 "You'll never see me" 줄의 모든 출력을 보장합니다. 리디렉션이 활성화된 동안에는 효과적으로 숨겨집니다.

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

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