Python 关闭缓冲
下面的缓冲区在哪里。。。我该如何关闭它 我正在用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() ... 所有这
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,