2011-09-04 52 views
5

我正在尝试调试一些我写的代码,这涉及很多并行进程。并有一些不需要的行为涉及到输出到sys.stdout和某些消息被打印两次。为了调试目的,知道在某个点sys.stdout是否已被刷新会非常有用。我想知道这是否可能,如果是的话,怎么样?如何判断sys.stdout是否已在Python中刷新

Ps。我不知道它是否重要,但我使用OS X(至少有一些sys命令取决于操作系统)。

+6

刷新与否,sys.stdout不会给你保证进程之间的顺序(甚至可能在同一进程中的线程之间)。为什么不分别添加准确的时间戳记和日志消息,或者甚至更好地让所有人都通过线程安全或进程间队列发送调试消息? – James

+0

问题是相同的输出发生两次,所以添加时间戳e.t.c.将不会真的有帮助。同时将sys.stdout更改为自定义也无济于事,因为这对缓冲区来说确实是一个问题。如果我用-u标志启动所有涉及的python进程,我不会遇到问题。我想知道究竟发生了什么,而不是在某些IO发生后总是冲洗,因为如果不理解问题的核心,那只是一个丑陋的解决方法。 – koffie

回答

1

答案是:你不能告诉(不是没有严重的丑陋,外部C模块或类似)。

原因是python的文件实现基于FILE *的C(stdio)实现。所以一个基础的python文件对象基本上只有一个对打开的FILE的引用。当写入数据时,C实现写入数据,当你告诉它python也只是转发flush调用。所以Python不保存这些信息。即使是底层的C层,一个快速搜索也会返回,没有记录的API允许您访问这些信息,但它可能位于对象的某个位置,因此理论上可以读出它是否非常需要。

+0

谢谢,不好意思,如果可能的话,它是如此麻烦。因为我只想知道这只是为了调试,所以我只是决定广告sys.stdout.flush()语句,看看我的程序行为是否改变。如果它改变了,我认为它在那个时候没有被刷新。 – koffie

相关问题