Skip to main content
 首页 » 编程设计

python之标准输入不应等待 "CTRL+D"

2025年05月04日15qq78292959

我得到了一个简单的 python 脚本,它应该从标准输入读取。 因此,如果我将程序的标准输出重定向到我的 Python 脚本的标准输入。

但我的程序记录到 python 脚本的内容只会在记录这些内容的程序被杀死时“到达”python 脚本。

但实际上我想在程序可用时立即处理程序记录的每一行,而不是在我的程序实际上应该 24/7 退出时处理。

那么我怎样才能做到这一点呢?如何让标准输入在处理数据之前不等待 CTRL+D 或 EOF?

例子

# accept_stdin.py 
import sys 
import datetime 
 
for line in sys.stdin: 
    print datetime.datetime.now().second, line 
 
# print_data.py 
import time 
 
print "1 foo" 
time.sleep(3) 
print "2 bar" 
 
# bash 
python print_data.py | python accept_stdin.py 

请您参考如下方法:

像所有文件对象一样,sys.stdin 迭代器以 block 的形式读取输入;即使一行输入已准备就绪,迭代器也会在输出任何内容之前尝试读取最大块大小或 EOF。您可以使用 readline 方法解决此问题,该方法没有此行为:

while True: 
    line = sys.stdin.readline() 
    if not line: 
        # End of input 
        break 
    do_whatever_with(line) 

您可以将其与 iter 的双参数形式结合使用使用 for 循环:

for line in iter(sys.stdin.readline, ''): 
    do_whatever_with(line) 

我建议在您的代码中留下评论,解释为什么您不使用常规迭代器。