2012-11-21 63 views
2

我有一個GUI Python程序,並通過有沒有辦法在Python中自動刷新/ fsync stderr?

import sys 
sys.stderr = open("err.log", "w") 

一個簡單的錯誤日誌記錄系統,它作品大多罰款。我遇到的一個問題是,無論何時遇到使用Windows 7和Python 2.7.3的運行時錯誤,只有在關閉程序後纔會寫入err.log文件。閱讀我收集的相關問題我需要在出錯後執行flush()和os.fsync()到sys.stderr,但我不知道如何輕鬆完成。

一種方法可能是在程序中的每個可能的點之後執行flush/fsync,但運行時錯誤是可能的,但這顯然不是一個好的解決方案。使用這種錯誤日誌記錄的主要原因是調試,所以根據定義,我不能事先知道需要刷新的地方,而不是在可能發生運行時錯誤的所有可能的地方刷新。既然有很多這樣的地方,我寧願不必嘗試/抓住他們每一個。

我正在使用PyGTK,因此沒有主循環可見,我可以在其中執行flush/fsync。

有什麼辦法可以告訴Python總是在出現錯誤後執行flush和fsync,或者有沒有人有其他想法如何解決這個(小問題)?

回答

1

我同意syhpoon:使用logging進行記錄。但是,如果你真的需要你的安排,再看第三buffering參數open來禁用它:

如果緩衝給出參數,0表示無緩衝,1表示行 緩衝,較大的數字指定緩衝區大小。首選的 打開文件的方式是使用內置的open()函數。

我試過這個,它的工作原理。在一個Python會話:

>>> a = open('/tmp/bar', 'w') 
>>> a.write('hi\n') 

而在另一個詞窗口:

$ cat /tmp/bar 
$ 

然後我重新跑了緩衝試驗禁用:

>>> a = open('/tmp/bar', 'w', 0) 
>>> a.write('hi\n') 

和:

$ cat /tmp/var 
hi 
$ 

所以使用logging ,但如果沒有,請查看是否只是禁用緩衝將會給你你需要的東西。

+0

這也適用於我,我會將其標記爲已接受。不過,我也很好奇伐木。我嘗試了一個簡單的例子,但有一些問題。不僅僅是在關閉程序之後才寫入日誌文件,我找不到一種方法來讓運行時錯誤被日誌記錄器處理。 – Asta

+0

更常見的使用模式是讓'logging'像平常一樣寫入stderr(它是無緩衝的),然後檢查該流是否生成。該工作流程經過了很好的測試。 –

1

也許一個logging modul電子我們會更好的選擇日誌?

+0

我沒有足夠的聲望來投票,所以我只是口頭表示,我不認爲這個答案對問題有任何用處,因爲問題與這個問題沒有任何關係記錄的靈活性和什麼。 – Asta

+0

成熟和已建立的日誌框架爲諸如您所描述的許多不同的兒童錯誤提供了經過測試的解決方案,這就是爲什麼它被推薦。 – 2012-11-21 18:06:17

相關問題