如何从命令行向Python sys.stdin发送EOF?CTRL-D无效
我在Unix系统的命令行中给我的Python程序发送数据。我想发送一个结束符(EOF),或者以某种方式清空标准输入的缓冲区,这样Python就能读取我的输入了。
如果我按下CTRL-C,程序会报一个键盘错误。
如果我按下CTRL-D,程序就会停止运行。
我该怎么清空标准输入的缓冲区呢?
4 个回答
我想我知道发生了什么。你在按 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
)
如果情况不是这样,你需要告诉我们更多关于你正在做的事情。
按下 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 时提前退出,那说明你的代码写得不好——你可以考虑编辑一下你的问题,添加一个你能想到的最简单的“出错”程序,这样我们就能准确告诉你哪里出错了。
如果你使用 'for l in sys.stdin',那么它是有缓冲的。
你可以使用:
while 1:
l = sys.stdin.readline()