如何避免Python fileinput的缓冲?
可能重复的问题:
如何设置 sys.stdin 的更小缓冲区大小?
我有一个用 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
的一些功能(比如它会自动打开传给我程序的所有文件,如果没有文件就用标准输入,而且它甚至可以自动解压输入文件)。
那么,我该如何兼顾这两者呢?理想的情况是,我不需要手动管理我的输入文件列表(包括解压),同时又能在“流式”使用时不延迟输入。
2 个回答
0
你试过这个吗:
def hook_nobuf(filename, mode):
return open(filename, mode, 0)
fi = fileinput.FileInput(openhook=hook_nobuf)
虽然我没有测试过,但根据我对openhook参数的理解,以及把0传给open函数的bufsize参数,这应该能解决问题。
3
试着运行 python -u
;手册上说这样做会“强制标准输入、标准输出和标准错误输出完全不使用缓存”。
你可以直接修改 filter.py
文件第一行的哈希邦路径。