2017-04-01 17 views
0

我有一個每分鐘運行一次的python腳本。爲了調試,我想創建帶有錯誤/異常的文本文件,以防發生。如果錯誤不存在,我不需要任何日誌文件。如何將python Errors(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位置不會已達到)。

if os.path.getsize('ERRORS_%s.txt' % (infile)) == 0: 
    os.remove('ERRORS_%s.txt' % (infile)) 

我得到的是WindowsError: [Error 32] The process cannot access the file because it is being used by another process。我認爲這是因爲只要腳本運行,stderr總是由python.exe使用。

對於第一步,我也試過:

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

這是自sys.stderr不工作從來都不是0

如何寫sys.stderr只有在以下情況下爲.txt實際錯誤?

+0

也許你可以使用該模塊此功能'logging'幫你收集的錯誤消息 – xiaoyi

回答

1

除非你有錯誤的數據量巨大擔心,你可以根據內容stderr重定向到一個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

我不能得到這個工作。在#do的東西下#我把類似'print(3/0)'的東西輸出一個錯誤,但沒有創建文本文件 - 這意味着錯誤沒有註冊到sys.stderr。 – Moondra

相關問題