sys.stdin在按下ctrl-d时不会关闭

5

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

from sys import stdin
for line in stdin:
    print line

我运行程序,输入一些代码,然后按下Ctrl+D,但是程序没有退出。

以下方法可以解决这个问题:

$ printf "echo" | python program.py 

为什么在我按下Ctrl+d后程序没有退出呢?我正在使用Fedora 18的终端。

你使用的是哪个Shell? - squiguy
哦,你需要输入两次 CTRL-D - Robᵩ
输入两次 CTRL-D 是不起作用的。 - Paul Draper
1个回答

15

Ctrl+D有一个奇怪的效果。它不会关闭输入流,而只是导致C级别的fread()返回一个空结果。对于常规文件来说,这意味着文件现在已经到达了结尾,但仍然可以读取更多内容,例如检查是否有其他人同时向文件中写入了更多数据。

此外,还存在缓冲问题——三个级别的缓冲!

  • Python迭代文件时会执行块缓冲。避免使用它从交互式流中读取数据。

  • C级stdin文件默认具有行缓冲。

  • 终端本身(!)处于其默认模式(“cooked mode”),在将一行数据发送到进程之前读取一行数据,这就解释了为什么在输入行的中间键入Ctrl+D没有任何效果。

如果您只需要检测作为独立行的Ctrl+D键,则此示例避免了第一个问题,这就是您所需要的全部:

import sys

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

除了来自 Ctrl+D 的 "line",每一行都以最终的 '\n' 结尾。如果是来自 Ctrl+D 的 "line",则只会得到 '' (但读取仍将继续,除非我们加入 if line == '': break)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接