stdout/stderr을 외부 파일로 리디렉션하는 것이 일반적이지만 범위 내에서 임시로 리디렉션해야 할 수도 있습니다.
기존 솔루션은 일반적으로 전체 출력 스트림을 대체하므로 이러한 스트림의 로컬 복사본은 영향을 받지 않습니다. 이로 인해 메서드가 스트림의 로컬 복사본을 사용할 때 문제가 발생할 수 있습니다.
이 제한 사항을 해결하기 위해 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!