sys.stdin不会在ctrl-d上关闭

时间:2013-03-27 18:44:31

标签: python linux command-line eof

我在program.py中有以下代码:

from sys import stdin
for line in stdin:
    print line

我跑,输入行,然后按 Ctrl + D ,但程序不会退出。

这确实有效:

$ printf "echo" | python program.py 

为什么按 Ctrl + d 时程序不会退出? 我正在使用Fedora 18终端。

1 个答案:

答案 0 :(得分:13)

Ctrl + D 有一个奇怪的效果。它不会关闭输入流,只会导致C级fread()返回空结果。对于常规文件,这样的结果意味着该文件现在已经结束,但是可以接受更多,例如,检查是否有人在此期间向该文件写了更多数据。

此外,还有缓冲问题---三个级别!

  • Python对文件的迭代会阻止缓冲。避免它从交互式流中读取。

  • 默认情况下,C级stdin文件具有行缓冲区。

  • 终端本身(!),在其默认模式(“熟食模式”)下,在将数据发送到流程之前读取一行数据,这解释了为什么键入 Ctrl + <在行中间输入时,kbd> D 没有任何效果。

这个例子避免了第一个问题,如果你想要的只是检测 Ctrl + D 作为它自己的行,你就可以得到它:

import sys

while True:
   line = sys.stdin.readline()
   print repr(line)

除了“行”来自 Ctrl + D 之外,你得到的每一行都有一个最终'\n',在这种情况下,你得到的只是''(但继续阅读,除非我们添加if line == '': break)。