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

Jos*_*ian 5 python unix command-line buffer

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

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

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

如何刷新stdin缓冲区?

Ale*_*lli 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()
Run Code Online (Sandbox Code Playgroud)

我们可以看到类似的东西

$ 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
$ 
Run Code Online (Sandbox Code Playgroud)

如果控制-D在第三行输入后立即被击中 - 程序意识到标准输入已完成,并执行所需的后处理,所有都干净利落.

如果您的程序过早地退出控制-D,它必须编码很糟糕 - 如何编辑您的问题以添加您可以想到的最小的"行为不端"程序,这样我们就可以准确地告诉您如何出错?


Jos*_*ian 2

如果您使用“for l in sys.stdin”,则会对其进行缓冲。

您可以使用:

  while 1:
     l = sys.stdin.readline()
Run Code Online (Sandbox Code Playgroud)

  • @JasonOrendorff:实际上,由于[预读缓冲区错误](http://bugs.python.org/issue3907),Python 2 上存在差异。您可以使用 for line in iter(sys.stdin.readline, ''):` 来解决它。尝试运行`cat | python2 -u -c"<在此处使用 sys.stdin 或 sys.stdin.readline()>"` 并键入一些输入。`readline()` 变体导致这些行立即可用。 (2认同)