2014-09-07 3 views
1

그래서 표준 출력을 기록하는 데코레이터를 작성하려고합니다. 인쇄도하고 있습니다. 요점은 출력을 포크하여 콘솔에 표시하고 기록되도록하는 것입니다.로깅이 제대로 작동하지 않습니다.

from time import time 
import tempfile 
import sys 
import datetime 

def printUsingTempFile(f): 

    def wrapper(*a, **ka): 
     with open('sysLog.txt', 'a') as logFile: 
      with tempfile.NamedTemporaryFile() as f: 
       sys.stdout = f 
       sys.stderr = f 

       retVal = f(*a, **ka) 

       f.flush(); f.seek(0); logFile.write('\n'.join(f.readlines())) 
       f.flush(); f.seek(0); sys.__stdout__.write('\n'.join(f.readlines())) 

       sys.stdout = sys.__stdout__ 
       sys.stderr = sys.__stderr__ 

     return retVal 
    return wrapper 

if __name__ == '__main__': 

    @printUsingTempFile 
    def someFunc(abc='Hello!!!'): 
     ''' 
     This is the docstring of the someFunc function. 
     ''' 
     print abc 
     return 1 

    someFunc('Print something here') 

내가 지금처럼 실행 : 그래서 이것은 내가 지금까지 무엇을 가지고

In [18]: !python utility.py 

내가 바보 iPython 창이 닫히고 run 기능을 사용하는 것입니다 실행하면 때문이다.

디렉토리에 'sysLog.txt'이라는 새 파일이 있는데 비어 있습니다. 그리고 어느 곳에서도 볼 수있는 출력이 없습니다. 오류 또는 아무것도 없습니다. 아무것도 아니야! 여기에 약간의 좌절감을 갖습니다. 이 코드를 :(디버깅하는 방법을 잘하지

편집 :.

def printUsingTempFile1(): 

    with open('sysLog.txt', 'a') as logFile: 
     with tempfile.NamedTemporaryFile() as f: 
      sys.stdout = f 
      sys.stderr = f 

      print 'This is something ...' 

      f.flush(); f.seek(0); logFile.write('\n'.join(f.readlines())) 
      f.flush(); f.seek(0); sys.__stdout__.write('\n'.join(f.readlines())) 

     sys.stdout = sys.__stdout__ 
     sys.stderr = sys.__stderr__ 

그리고이 기능 :

내가 코드를 업데이트, 그래서 내가 두 번 추구되지 않았 음을 깨달았다 나는 다음 코드를 시도

+2

파일에 쓰고 다시 읽는 대신에,'write (self, value)'메쏘드가 원래의'stdout'과 로거 모두에 쓰는 곳에'LoggingWriter'를 생성하여 프로세스를 되돌립니다. – Wolph

+0

지금 일하고 있습니다. Sanjay에게 감사드립니다. – ssm

+0

요점은 파일에 쓰고 다시 읽는 것은 자원 낭비입니다;) – Wolph

답변

2

f을 사용하여 장식 파일에 전달 된 함수의 이름과 임시 파일의 이름을 사용하고있는 이유는 무엇입니까? f(*a, **ka) 오류가 발생하여 리디렉션했습니다. 오류 스트림을 임시 파일에 보내면 아무 것도 쓰지 않고 닫히고 따라서 콘솔에는 아무 것도 닫히지 않습니다.

이런 종류의 상황을 디버깅하기위한 팁은 하나씩 작동하지 않는 코드 조각을 제거하고 작동하는 최소 수준으로 가져 오는 것입니다. 그리고 실패하기 시작할 때까지 다시 일하십시오. :)

편집하는

나는 또한이 같은 문제를 잡으려고 보풀이 도구에서 코드를 실행 추천하고 싶습니다. 예 : 코드는 아래에 게시 :

W : 6,19 : 사용하지 않은 인수 '인수'(미사용 인수)

위의 코드에 pylint 실행
''' This is a test module ''' 
import tempfile 
import sys 


def print_tmp_file(arg): 
    ''' Print out the things using temp file ''' 
    def wrapper(*a, **ka): 
    ''' Wrapper function ''' 
     with open('sysLog.txt', 'a') as log_file: 
      with tempfile.NamedTemporaryFile() as arg: 
       sys.stdout = arg 
       sys.stderr = arg 
       ret_val = arg(*a, **ka) 
       arg.flush() 
       arg.seek(0) 
       log_file.write('\n'.join(arg.readlines())) 
       arg.flush() 
       arg.seek(0) 
       sys.__stdout__.write('\n'.join(arg.readlines())) 
       sys.stdout = sys.__stdout__ 
       sys.stderr = sys.__stderr__ 
       return ret_val 

    return wrapper 


if __name__ == '__main__': 
    @print_tmp_file 
    def some_func(abc='Hello!!!'): 
     ''' This is the docstring of the someFunc function. ''' 
     print abc 
     return 1 

    some_func('Print something here') 

다음과 같은 경고를 제공합니다

이것은 무언가가 잘못되었다는 것을 명확하게 나타내는 것입니다.

+0

사실, 파일에 대한'arg' isnt. 데코레이터에 의해 랩핑 (wrap)되는 함수입니다.'def printUsingTempFile (arg) :'를 사용하는 경우'retVal = f (* a, ** ka)'줄은'retVal = arg (* a, ** ka)'로 변경되어야합니다. 그게 실수 였어. 이 방법은 제공된 기능이 무엇이든간에 파일에 인쇄하고 기록됩니다. 그러나, 결국 나는 solamz의 sugeston을 들여다 볼 필요가 있다고 생각합니다. 나는 많은 어려움을 덜어 줬을지도 모른다. – ssm