我正在从unix上的命令行写入我的Python进程。我想发送EOF(或以某种方式刷新stdin缓冲区,因此Python可以读取我的输入。)
如果我按下CTRL-C,我会得到一个KeyboardError。
如果我按下CTRL-D,程序就会停止。
如何刷新stdin缓冲区?
答案 0 :(得分:12)
Control-D不应该让你的程序“停止” - 它应该关闭标准输入,如果你的程序处理得当,它可以完美地继续,如果它需要!
例如,给定以下st.py
:
import sys
def main():
inwas = []
for line in sys.stdin:
inwas.append(line)
print "%d lines" % len(inwas),
print "initials:", ''.join(x[0] for x in inwas)
if __name__ == '__main__':
main()
我们可以看到类似
的内容$ python st.py
nel mezzo del cammin di nostra vita
mi ritrovai per una selva oscura
che la diritta via era smarrita
3 lines initials: nmc
$
如果在第三行输入后立即点击control-D - 程序意识到标准输入已完成,并执行所需的后处理,所有这些都很整洁。
如果您的程序过早退出控件-D,它必须编码错误 - 如何编辑您的问题以添加您可以想到的最小的“行为不端”程序,这样我们就可以准确地告诉您如何出错?
答案 1 :(得分:2)
如果在sys.stdin中使用'for l',它将被缓冲。
您可以使用:
while 1:
l = sys.stdin.readline()
答案 2 :(得分:2)
我想我知道发生了什么。您没有点击ctrl-D
即可点击enter
。如果要向程序发送一行,只需按Enter键即可。如果您点击ctrl-D
而未点击enter
,则可以再次点击ctrl-D
,然后您的程序会看到该行。在这种情况下(连续两个ctrl-D
),您的程序将不会在该行的末尾看到换行符。
例如,假设我有一个Python脚本a.py
:
import sys
for line in sys.stdin:
sys.stdout.write('%s' % line)
我执行它:
$ python a.py
然后输入以下内容:
line 1
line 2<ctrl-D><ctrl-D>
程序将打印:
line 1
line 2$
$
是shell提示符。这是一个包含上述输入的完整会话:
$ python a.py
第1行
第2行第1行
第2行 $
( Bold 显示程序的输出.Roman-case用于显示我输入的内容,没有显示两个ctrl-D
s)
如果这不是正在发生的事情,你需要告诉我们更多关于你在做什么的事情。
答案 3 :(得分:1)
try:
# You might be inside the while-loop
foo = raw_input('Spam: ') # Or whatever...
except EOFError:
print 'And now for something completely different.'
sys.exit()