>  기사  >  백엔드 개발  >  로컬 스트림 복사본에 영향을 주지 않고 Python 메서드에서 stdout/stderr을 일시적으로 리디렉션하는 방법은 무엇입니까?

로컬 스트림 복사본에 영향을 주지 않고 Python 메서드에서 stdout/stderr을 일시적으로 리디렉션하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-27 00:12:30235검색

How to Temporarily Redirect stdout/stderr in Python Methods Without Affecting Local Stream Copies?

메서드에서 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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