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

有没有办法在Python中自动刷新/fsync stderr?,python,pygtk,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(),但我不知道如何轻松做到这一点 一种方法可能是在程序中每个可能出现运行时错误的点之后执行

我有一个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,或者有没有人有其他办法来解决这个(小)问题?

也许我们是日志的更好选择?

我同意syhpoon:使用
日志记录
进行日志记录。但是如果您确实需要您的安排,请查看
打开
的第三个
缓冲
参数以禁用它:

如果给定缓冲参数,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')
以及:


因此,请使用
日志记录
,如果没有,请查看禁用缓冲是否能满足您的需要。

这对我也适用,我会将其标记为已接受。然而,我对日志记录也很好奇。我尝试了一个简单的例子,但有一些问题。日志文件不仅是在关闭程序后才写入的,我也找不到一种方法让日志程序处理运行时错误。更常见的使用模式是让
日志记录
像往常一样写入stderr(无缓冲),然后在生成流时检查它。这个工作流程经过了很好的测试,我没有足够的声誉来投票,所以我会口头表达我不认为这个答案对这个问题有用。因为这个问题与日志记录的灵活性无关。成熟和成熟的日志记录框架为许多不同的子错误(如您所描述的)提供了经过战斗测试的解决方案,这就是为什么推荐它的原因。
$ cat /tmp/var
hi
$