Python의 상황별 스트림 리디렉션
표준 출력 및 오류 스트림(stdout 및 stderr) 리디렉션은 많은 시나리오에서 유용한 것으로 입증되었습니다. 그러나 함수가 이러한 스트림에 대한 내부 참조를 보유할 때 기존 방법은 부족한 경우가 많습니다.
동적 솔루션이 필요함
sys.stdout과 같은 전통적인 리디렉션 기술, 스트림을 영구적으로 리디렉션합니다. 이 문제는 메서드가 본질적으로 이러한 변수 중 하나를 내부적으로 복사할 때 발생합니다. 결과적으로 이러한 방법은 스트림을 적절하게 리디렉션하지 못합니다.
해결책: 컨텍스트 관리자 확장
이 문제를 효과적으로 해결하려면 컨텍스트 관리자 접근 방식을 사용할 수 있습니다. 이 방법에는 컨텍스트 관리자 내에서 리디렉션 논리를 래핑하는 작업이 포함됩니다.
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
이 컨텍스트 관리자를 활용하면 컨텍스트 블록 내에서 스트림을 원활하게 리디렉션할 수 있습니다.
devnull = open(os.devnull, 'w')
print('Fubar')
with RedirectStdStreams(stdout=devnull, stderr=devnull):
print("You'll never see me")
print("I'm back!")
결론
제공된 솔루션은 컨텍스트 관리자 패턴을 활용하여 stdout 및 stderr를 일시적으로 리디렉션하여 이전 접근 방식의 한계를 우회합니다. . 이 기술은 이러한 스트림에 대한 로컬 참조를 보유하는 함수를 처리할 때 특히 유용한 것으로 입증되었습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3