如何在Python中以交互方式处理标准输入行?

时间:2015-01-26 15:44:19

标签: python buffer stdin

我想使用Python作为外部进程,并通过标准输入/标准输出与它进行通信。具体来说,我想

for line in sys.stdin:
    result = compute_something(line)
    print result
    sys.stdout.flush()

输出刷新是为了立即返回结果,而不进行缓冲。我想对输入做同样的事情---立即处理每一行,而不进行缓冲。但是,上面的代码不会单独响应每一行;它等待,直到标准输入中累积了大量数据,然后立即处理所有数据。

这是真的即使调用程序用每一行刷新其标准输出。它也是真的即使我在控制台上直接运行上述内容。缓冲区是Python,而不是调用程序。

此外,我发现控制台上的control-D使Python刷新其标准输入缓冲区。 (然后我可以继续发送更多的输入!)然而,这对我没用,因为调用程序不能在每行的末尾发送等效的control-D。

还有一件事:for line in sys.stdin.xreadlines()似乎等同于for line in sys.stdin:它们都缓冲。

所以我的问题是,如何编写一个不缓冲其输入的Python脚本,以便它立即处理每一行输入?

1 个答案:

答案 0 :(得分:0)

(我在发布问题之前解决了问题,但我认为无论如何我应该分享它 - 其他人可能会遇到这个问题,我仍然对为什么这个问题的任何评论感兴趣我们应该知道如何控制Python或Linux的隐式缓冲。)

这是避免输入缓冲的一种方法:

while True:
    line = sys.stdin.readline()
    result = compute_something(line)
    print result
    sys.stdout.flush()

显然,.readline()在直接迭代时避免了输入缓冲区而.xreadlines()没有。