Python 关闭缓冲

Python 关闭缓冲,python,linux,bash,buffering,Python,Linux,Bash,Buffering,下面的缓冲区在哪里。。。我该如何关闭它 我正在用python程序向标准输出,如下所示: for line in sys.stdin: print line 这里有一些缓冲: tail -f data.txt | grep -e APL | python -u Interpret.py 我尝试了以下方法来摆脱可能的缓冲。。。没有运气: 如上所述,在python调用中使用-u标志 在每次sys.stdout.write()调用之后调用sys.stdout.flush() ... 所有这

下面的缓冲区在哪里。。。我该如何关闭它

我正在用python程序向标准输出,如下所示:

for line in sys.stdin:
    print line
这里有一些缓冲:

tail -f data.txt | grep -e APL | python -u Interpret.py
我尝试了以下方法来摆脱可能的缓冲。。。没有运气:

  • 如上所述,在python调用中使用-u标志
  • 在每次sys.stdout.write()调用之后调用sys.stdout.flush() ... 所有这些都会创建一个缓冲流,python会等待一分钟来打印前几行
  • 使用了以下修改的命令:

    stdbuf-o0 tail-f data.txt | stdbuf-o0-i0 grep-e APL | stdbuf-i0-o0 python-u exploration.py

为了衡量我的期望,我尝试:

tail -f data.txt | grep -e APL 
这会产生稳定的管线流。。。它肯定没有python命令那样缓冲

那么,如何关闭缓冲呢?
答:结果是在管道的两端都有缓冲。

sys.stdout=os.fdopen(sys.stdout.fileno(),'w',0)并确保在您的环境中设置了
PYTHONUNBUFFERED

我认为问题在于
grep
缓冲其输出。当你用管道输送
tail-f | grep…|一些其他程序
。要使
grep
每行刷新一次,请使用
--line buffered
选项:

% tail -f data.txt | grep -e APL --line-buffered | test.py
APL

APL

APL
其中
test.py
为:

import sys
for line in sys.stdin:
    print(line)
(在linux、gnome终端上测试。)

文件。文件中的行的readlines()
具有不受
-u
选项影响的内部缓冲(请参阅)。使用

相反


顺便说一句,
sys.stdout
在默认情况下是行缓冲的,如果它指向终端,
sys.stderr
是无缓冲的(请参阅)。

问题在for循环中。它将等待EOF,然后继续。你可以用这样的代码来修复它

while True:
    try:
        line = sys.stdin.readline()
    except KeyboardInterrupt:
        break 

    if not line:
        break

    print line,

试试这个。

我希望它是一个复制品。这里提到的所有解决方案都不适用于我的情况!不是这样的。。。应该说我已经试过了。另外,PYTHOHNUNBUFFERED似乎等同于设置-u标志,顺便说一句,对于python3,上面的行导致错误:ValueError:cannothaveunbufferedtext I/OYes是!!!这就是答案!虽然准确地说,我必须使用While True:line=sys.stdin.readline()。。。你目前的建议对我不起作用。所以,我认为是管道两端的缓冲让它变得很难。。。谢谢。嗯,很有趣!您使用的是什么版本的Python和什么操作系统?(我的版本适用于Python2.7+Ubuntu+gnome终端)。对于Python3,您的方法是有效的。在Python2.6中,它不会将第一行替换为
l=None;而我!='':所以循环在输入结束时终止?
while True:
    try:
        line = sys.stdin.readline()
    except KeyboardInterrupt:
        break 

    if not line:
        break

    print line,