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