如何避免Python fileinput缓冲

时间:2011-05-17 16:04:30

标签: python readline buffering file-io

  

可能重复:
  Setting smaller buffer size for sys.stdin?

我有一个使用fileinput的Python(2.4 / 2.7)脚本来读取标准输入或文件。它易于使用,除了一种情况外效果很好:

tail -f log | filter.py

问题是我的脚本缓冲了它的输入,而(至少在这种情况下)我希望立即看到它的输出。这似乎源于fileinput在执行任何操作之前使用readlines()来获取其bufsize个字节的事实。我尝试使用1的bufsize,它似乎没有帮助(这有点令人惊讶)。

我确实发现我可以编写不缓冲的代码:

while 1:
    line = sys.stdin.readline()
    if not line: break
    sys.stdout.write(line)

这样做的问题是我丢失了fileinput功能(即它会自动打开传递给我程序的所有文件,如果没有则会打开stdin,它甚至可以自动解压缩输入文件)。

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

2 个答案:

答案 0 :(得分:2)

尝试运行python -u;男人说它会“迫使stdin,stdout和stderr完全没有缓冲”。

您可以在filter.py的第一行更改hashbang路径。

答案 1 :(得分:0)

你试过了吗?

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

fi = fileinput.FileInput(openhook=hook_nobuf)

没有对它进行测试,但是从阅读openhook param所做的以及为bufsize param传递0以打开的内容,这应该可以解决问题。