>백엔드 개발 >파이썬 튜토리얼 >시스템 호출 출력을 포함하여 Python의 sys.stdout을 로그 파일에 복제하는 방법은 무엇입니까?

시스템 호출 출력을 포함하여 Python의 sys.stdout을 로그 파일에 복제하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-27 06:04:14377검색

How to Duplicate Python's sys.stdout to a Log File, Including System Call Output?

sys.stdout을 로그 파일에 복제

이 프로그래밍 수수께끼의 목표는 다음을 포함하여 Python 애플리케이션의 모든 출력을 복제하는 것입니다. 시스템 호출 출력을 별도의 로그 파일에 저장합니다. 그러나 이 작업은 사용자에게 어려운 작업임이 입증되었습니다.

처음에 사용자는 dup2 호출 순서를 반대로하여 해결 방법을 시도했지만 소용이 없었습니다. 아래 코드는 실패한 시도를 보여줍니다.

import os, sys

so = se = open("a.log", 'w', 0)
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

os.dup2(sys.stdout.fileno(), so.fileno())
os.dup2(sys.stderr.fileno(), se.fileno())

print("foo bar")

os.spawnve("P_WAIT", "/bin/ls", ["/bin/ls"], {})
os.execve("/bin/ls", ["/bin/ls"], os.environ)

이 접근 방식을 사용하면 "a.log" 파일에 화면에 표시된 것과 동일한 출력이 포함되어야 했지만 그렇지 않았습니다.

해결책

다행히 이 문제에는 해결책이 있습니다. 아래 코드는 sys.stdout을 지정된 로그 파일에 성공적으로 복제하는 Tee라는 클래스를 제공합니다.

class Tee(object):
    def __init__(self, name, mode):
        self.file = open(name, mode)
        self.stdout = sys.stdout
        sys.stdout = self
    def __del__(self):
        sys.stdout = self.stdout
        self.file.close()
    def write(self, data):
        self.file.write(data)
        self.stdout.write(data)
    def flush(self):
        self.file.flush()

이 클래스를 사용하면 사용자가 Tee 인스턴스를 생성하고 로그 파일의 이름과 모드를 지정할 수 있습니다. 그 후 sys.stdout은 Tee 인스턴스로 리디렉션되어 화면의 출력을 계속 유지하면서 모든 출력을 로그 파일에 효과적으로 복제합니다.

위 내용은 시스템 호출 출력을 포함하여 Python의 sys.stdout을 로그 파일에 복제하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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