我得到了一个简单的 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)
我建议在您的代码中留下评论,解释为什么您不使用常规迭代器。
