如何从命令行向Python sys.stdin发送EOF?CTRL-D无效

6 投票
4 回答
23787 浏览
提问于 2025-04-15 16:56

我在Unix系统的命令行中给我的Python程序发送数据。我想发送一个结束符(EOF),或者以某种方式清空标准输入的缓冲区,这样Python就能读取我的输入了。

如果我按下CTRL-C,程序会报一个键盘错误。

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

我该怎么清空标准输入的缓冲区呢?

4 个回答

2

我想我知道发生了什么。你在按 ctrl-D 的时候没有按 enter。如果你想把一行内容发送给程序,只需要按一下 enter。如果你在没有按 enter 的情况下按了 ctrl-D,你可以再按一次 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$

$ 是命令行提示符。这里是一个完整的会话,包含上面的输入:

$ python a.py
line 1
line 2 line1
line 2$

(加粗的部分是程序的输出。罗马字母部分是我输入的内容,不包括那两个 ctrl-D)

如果情况不是这样,你需要告诉我们更多关于你正在做的事情。

14

按下 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——程序会意识到标准输入已经结束,然后进行必要的后续处理,一切都很整齐。

如果你的程序在按下 Control-D 时提前退出,那说明你的代码写得不好——你可以考虑编辑一下你的问题,添加一个你能想到的最简单的“出错”程序,这样我们就能准确告诉你哪里出错了。

2

如果你使用 'for l in sys.stdin',那么它是有缓冲的。

你可以使用:

  while 1:
     l = sys.stdin.readline()

撰写回答