2017-04-01 4 views
0

나는 1 분에 1 회 실행되는 파이썬 스크립트를 가지고있다. 디버깅을 위해 오류/예외가있는 텍스트 파일을 만들려고합니다. 오류가없는 경우 로그 파일을 원하지 않습니다.python 오류 (stderr)를 로그 파일에 저장하는 방법 오류가 실제로 발생하는 경우에만 사용할 수 있습니까?

편집 : 모든 코드를 try/except 루프에 넣을 수 없으므로 this은 도움이되지 않습니다.

첫째, 내가 stderr을 저장하고하는 일을 .txt로합니다 : 오류가 발생하지 이후

sys.stderr = open('ERRORS_%s.txt' % (infile), 'a') 
with open("%s_Error_Messages.txt" % (MSKSN), "a") as myfile: 
    myfile.close() 

둘째, 나는 다음 (어떤 raise SystemExit 위치하기 전에 빈 "%s_Error_Messages.txt" % (MSKSN) 파일을 삭제하려고 그렇지 않으면 raise SystemExit 위치가없는 것 도달했습니다).

내가 얻는 것은 WindowsError: [Error 32] The process cannot access the file because it is being used by another process입니다. 나는 이것이 스크립트가 실행되는 한 stderr이 항상 python.exe에 의해 사용되기 때문이라고 가정합니다. 첫 번째 단계에 대한

, 나는 또한 시도 : sys.stderr를하기 때문에 작동하지 않습니다

if sys.stderr != 0: 
    sys.stderr = open('ERRORS_%s.txt' % (infile), 'a') 

이 결코 경우에만 .txt로하는 sys.stderr를 작성하는 방법

0 실제 오류? 당신이 걱정하는 오류 데이터의 거대한 볼륨이 없다면

+0

을 사용하여이 기능을 설정을 시도 할 수'나는 이것을 얻을 수없는 당신이 – xiaoyi

답변

1

, 당신은 단지 내용에 따라 그것을 밖으로 쓰기 (여부) 다음있는 StringIO 객체로 표준 오류를 리디렉션 할 수 있습니다

import StringIO 
import sys 

sys.stderr = StringIO.StringIO() 
# do stuff 
if sys.stderr.getvalue(): 
    with open ("path/to/log.txt") as output: 
     output.write(sys.stderr.getvalue()) 

이것은 중대하다 대체 stderr를 설정하는 컨텍스트 관리자의 경우 코드를 실행 한 다음 stderr를 sys.__stderr__으로 다시 설정합니다. 당신이 시도의 코드를 포장 할 수없는 경우

, 당신은 또한 어쩌면 당신은 모듈을 사용할 수 있습니다 sys.excepthook

+0

을 오류 메시지를 수집하기 위해 logging' 작업. #do stuff 아래에 나는 print (3/0)과 같은 것을 넣는다. 에러를 출력해야하지만 텍스트 파일은 생성되지 않는다. 이것은 에러가 sys.stderr에 등록되지 않았다는 것을 의미한다. – Moondra