如何避免Python fileinput的缓冲?

11 投票
2 回答
9924 浏览
提问于 2025-04-16 17:49

可能重复的问题:
如何设置 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 文件第一行的哈希邦路径。

撰写回答