2012-01-08 2 views
8

모든 인쇄 문을 터미널과 파일로 모두 출력해야합니다. 나는 내가 파일 및 인쇄는 터미널의 정상 작동으로 돌아가 작성을 중지하고자 할 때stdout을 원본으로 복원 할 수 없습니다 (터미널에만 해당).

내 문제는, 그래서 내가

class Tee(object): 
    def __init__(self, name): 
     self.file = open(name, "a") 
     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) 

sys.stdout = Tee("log.txt") 

이 위대한 작품을 사용 this stackoverflow question 에서 해결책을 찾았습니다
del (sys.stdout)을 사용하여 del 메서드를 호출했습니다.
는 난에 마지막 라인을 변경하려고 :

multiple_print = Tee("log.txt") 
    sys.stdout = multiple_print 

및보다 사용 델 (multiple_print)와 상관없이 내가 뭘하려

실패하지, 여전히 단자와 파일에 기록 인쇄의 추가 사용 양자 모두.

아이디어가 있으십니까?

oldstdout = sys.stdout 

을하고 이후 sys.stdout에 재 할당 :

답변

12

당신은 재 할당하기 전에 원래 파일 기술자에 대한 참조를 저장해야합니다!

del 문은 __del__을 직접 호출하지 않고 오히려 개체의 참조 카운터를 줄입니다. 참조 카운터가 0에 도달하여 개체가 손상 될 경우 __del__ 메서드가 호출됩니다. 따라서 재 할당을 강제 할 수는 없기 때문에 가비지 수집기가 사용자의 __del__ 메서드를 호출해야합니다.

당신은 직접 sys.stdout 변수를 재 할당해야합니다

시도 :

sys.stdout = sys.__stdout__ 
+0

감사합니다. 나는 복잡한 해결책을 만들고 작동을 잊어 버리려고 노력한다. 그러나 __del__이 작동하지 않는 이유를 알고 있습니까? (__init__ 부분에 저장된 sys.stdout = self.stdout을 포함합니다.) –

+11

[sys .__ stdout__] (http://docs.python.org/library/sys.html#sys.__stdout__) 이전 참조를 직접 저장하는 대신 –

+0

귀하의 후속 조치를 해결하기 위해 제 답변을 업데이트했습니다! 그리고 Frederic Hamidi는 요점이 있습니다! 나는'sys .__ stdout__'에 대해 몰랐다! –

관련 문제