메서드에서 stdout/stderr를 일시적으로 리디렉션: 불완전한 현재 솔루션
Python에서 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 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>
이 예에서 RedirectStdStreams 클래스는 stdout 및 stderr을 모두 지정된 대상으로 리디렉션하도록 설계되었습니다(예: /dev/null) 정의된 컨텍스트 내. 이 접근 방식은 로컬 스트림 복사를 중단하지 않고 효과적으로 스트림을 리디렉션합니다.
위 내용은 로컬 스트림 복사본에 영향을 주지 않고 Python 메서드에서 stdout/stderr을 일시적으로 리디렉션하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!