【问题标题】:Is there a way to auto-flush/fsync stderr in Python?有没有办法在 Python 中自动刷新/fsync stderr?
【发布时间】:2012-11-21 16:43:49
【问题描述】:

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

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

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

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

我正在使用 PyGTK,因此我看不到可以执行刷新/fsync 的主循环。

有没有办法告诉 Python 在出错后始终执行刷新和 fsync,或者有没有人有其他想法如何解决这个(小)问题?

【问题讨论】:

    标签: python pygtk


    【解决方案1】:

    我同意 syhpoon:使用 logging 进行日志记录。但如果你真的需要你的安排,请查看open 的第三个buffering 参数来禁用它:

    如果给出了缓冲参数,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,但如果不是,请查看是否仅禁用缓冲就能满足您的需求。

    【讨论】:

    • 这也适用于我,我会将其标记为已接受。但是,我也对日志记录感到好奇。我尝试了一个简单的示例,但存在一些问题。不仅是在关闭程序后才写入日志文件,而且我找不到让记录器处理运行时错误的方法。
    • 一种更常见的使用模式是让logging 像往常一样写入stderr(无缓冲),然后在生成该流时对其进行检查。该工作流程经过了很好的测试。
    【解决方案2】:

    也许logging module 是日志的更好选择吗?

    【讨论】:

    • 我没有足够的声望来否决这个问题,所以我只是口头表达我认为这个答案对这个问题没有任何用处,因为问题没有与日志记录的灵活性等有关。
    • 成熟且成熟的日志框架为您描述的许多不同的子错误提供了久经考验的解决方案,这就是推荐它的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 2019-11-28
    • 2020-07-17
    • 1970-01-01
    • 2012-10-16
    相关资源
    最近更新 更多