如何从命令行发送EOF到Python sys.stdin? CTRL-D不起作用

时间:2009-12-12 03:54:43

标签: python unix command-line buffer

我正在从unix上的命令行写入我的Python进程。我想发送EOF(或以某种方式刷新stdin缓冲区,因此Python可以读取我的输入。)

如果我按下CTRL-C,我会得到一个KeyboardError。

如果我按下CTRL-D,程序就会停止。

如何刷新stdin缓冲区?

4 个答案:

答案 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()