如何在每台计算机上设置stdout unbuffered?

时间:2013-10-16 21:40:10

标签: python stdout popen buffering unbuffered

我遇到了一个案例,我的机器缓冲了stdout,但同事的机器没有缓冲stdout完全相同的代码。我们运行的环境几乎完全相同(我们在VMware Player中都使用相同的虚拟机映像,但他在Mac上,而在PC上)。代码使用Popen()从另一个执行一个python脚本,执行的脚本在我的机器上缓冲stdout,但不是他的。

我知道这些控制python缓冲stdout的方法:Disable output buffering

但两台机器都没有设置PYTHONUNBUFFERRED环境变量,并且在任何代码中都没有使用任何用于解缓冲stdout的编程方法。

顺便说一下,在Popen()调用中添加“-u”会导致stdout在我的机器上无缓冲,但没有改变他的行为。

考虑到前言,其他什么东西可能会导致stdout在一台机器上缓冲而在另一台机器上无缓冲,对于其他相同的代码?

这可能是深奥的,但重要的是我能够做出彻底的解释,而且我的搜索字符串已经用完了。

编辑:可以从命令行或桌面链接(发出bash命令)调用初始程序。 VM正在运行Ubuntu Linux。我将尝试发布一个简单的代码示例,但这可能需要一些时间。

考虑到调用,我刚刚意识到我通常从命令行启动,他通常从桌面快捷方式启动,这可能是关键的区别。但我还是不知道为什么......

这里有一些代码可以展示我正在做的事情(大多数情况下;还有更多内容,但我很难知道相关内容。)

process = Popen(['python', '-u', 'some_script.py'], shell=False, stdout=PIPE)
char = ''
while char != '\n' and len(read) > 0: 
    read, write, exception = select([stdout],[],[],0)          
    if read is not None and len(read) > 0:
        char = stdout.readline(1)
        output_buffer += char
#end while

if char == '\n':
    print output_buffer
    output_buffer = ''

调用脚本调用Popen,然后执行非阻塞缓冲读取,通过在stdout上选择读取一个字符,直到它得到一个\ n或者没有什么可读的。

调用的脚本基本上只使用“print”打印一行文本(此处不再复制)。

0 个答案:

没有答案