如何避免Python文件输入缓冲

如何避免Python文件输入缓冲,python,readline,buffering,file-io,Python,Readline,Buffering,File Io,可能重复: 我有一个Python(2.4/2.7)脚本,使用fileinput从标准输入或文件中读取。它易于使用,除了一种情况外,工作良好: tail -f log | filter.py 问题是我的脚本缓冲了它的输入,而(至少在本例中)我希望立即看到它的输出。这似乎源于这样一个事实:fileinput使用readlines()在执行任何操作之前,先抓取其bufsize值的字节。我尝试使用bufsize 1,但似乎没有帮助(这有点令人惊讶) 我确实发现我可以编写这样的代码,它不会缓冲: wh

可能重复:

我有一个Python(2.4/2.7)脚本,使用
fileinput
从标准输入或文件中读取。它易于使用,除了一种情况外,工作良好:

tail -f log | filter.py
问题是我的脚本缓冲了它的输入,而(至少在本例中)我希望立即看到它的输出。这似乎源于这样一个事实:fileinput使用
readlines()
在执行任何操作之前,先抓取其
bufsize
值的字节。我尝试使用bufsize 1,但似乎没有帮助(这有点令人惊讶)

我确实发现我可以编写这样的代码,它不会缓冲:

while 1:
    line = sys.stdin.readline()
    if not line: break
    sys.stdout.write(line)
这样做的问题是我丢失了fileinput功能(即它自动打开传递给我的程序的所有文件,如果没有,则打开stdin,甚至可以自动解压缩输入文件)

那么我怎样才能两者兼得呢?理想情况下,我不需要显式管理输入文件列表(包括解压缩),但以“流”方式使用时不会延迟输入。

您尝试过:

def hook_nobuf(filename, mode):
    return open(filename, mode, 0)

fi = fileinput.FileInput(openhook=hook_nobuf)

没有对它进行测试,但是通过读取openhook参数的功能以及将0传递给bufsize参数打开的功能,应该可以做到这一点。

尝试运行
python-u
;曼恩说,这将“迫使stdin、stdout和stderr完全无缓冲”


您只需在
filter.py

的第一行更改hashbang路径,关闭stdin文件句柄,然后使用
buffering=0
重新打开它(我还没有尝试过,所以我不打算将其作为答案发布)。您可能会说fileinput使用readlines()来错误描述这种情况。默认情况下,readlines()在到达EOF之前不会返回,而“for line in fileinput.input():”和“for line in sys.stdin:”在缓冲足够的字符后最终将返回一些内容。不过,如果fileinput传递一个bufsize参数,那么它在内部使用readlines()可能是对的。我刚刚提交了错误报告“fileinput和”for line in sys.stdin“对输入缓冲进行奇怪的模拟”,其中包括您观察到的行为。概要:fileinput在2.7和3.4中都被破坏,“for line in sys.stdin:”在2.7中被破坏,但在3.4中被修复,readline在2.7和3.4中都能正常工作。
注意,在xreadlines()、readlines()和文件对象迭代器(“for line in sys.stdin”)中有内部缓冲这不受此选项的影响。
是的,因为tMC声明,这不起作用。不过我确实试过了。然后不要使用基于行的I/O。使用普通的
stdin.read()
.readline()(单数)就可以了。只有readlines()(复数)可以进行我不想要的缓冲。我想raw read()也可以,但在这种情况下没有必要,这没有效果。同样的问题似乎是fileinput在内部使用readlines()方法和缓冲区。要么不使用fileinput,要么以fileinput.py作为基础,将其重写为不在内部缓冲。看看代码,似乎没有任何方法可以让它不通过向其传递参数来进行至少一些缓冲;令人震惊的是,这个用例没有被很好地涵盖(如果不是因为这个原因,用Python编写文本过滤器似乎很自然)。