有没有办法在Python中自动刷新/ fsync stderr?

时间:2012-11-21 16:43:50

标签: python pygtk

我有一个GUI python程序和一个简单的错误记录系统,通过

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

它的工作原理很好。我遇到的一个问题是,每当我遇到使用Windows 7和Python 2.7.3的运行时错误时,文件err.log只有在我关闭程序后才会被写入。阅读我收集到的相关问题我需要在出错后对sys.stderr执行flush()和os.fsync(),但我不知道如何轻松地执行此操作。

一种方法可能是在程序中可能出现运行时错误的每个可能点之后执行flush / fsync,但这显然不是一个好的解决方案。使用此错误日志记录的主要原因是调试,因此根据定义,我无法事先知道除了可能出现运行时错误的所有可能位置之外我需要刷新的位置。由于有很多这样的地方,我宁愿不必尝试/捕捉它们中的每一个。

我正在使用PyGTK,因此我无法看到主循环,我可以执行flush / fsync。

有没有办法告诉Python在发生错误后总是执行flush和fsync,或者有没有人有其他想法如何解决这个(次要)问题?

2 个答案:

答案 0 :(得分:1)

也许logging modul我们可以更好地选择日志吗?

答案 1 :(得分: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,但如果没有,请查看禁用缓冲是否能满足您的需求。