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

Pau*_*per 5 python linux command-line eof

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

from sys import stdin
for line in stdin:
    print line
Run Code Online (Sandbox Code Playgroud)

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

这确实有效:

$ printf "echo" | python program.py 
Run Code Online (Sandbox Code Playgroud)

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

Arm*_*igo 14

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

另外,还有缓冲问题---它们的三个层次!

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

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

  • 终端本身(!),在其默认模式("熟模式")中,在将数据发送到进程之前读取一行数据,这解释了为什么键入Ctrl+ D在行中间键入时没有任何效果.

这个例子避免了第一个问题,如果你想要的只是检测Ctrl+ D键入它自己的行,这就是你所需要的:

import sys

while True:
   line = sys.stdin.readline()
   print repr(line)
Run Code Online (Sandbox Code Playgroud)

你得到的每一行都有一个决赛'\n',除了"线"来自一个Ctrl+ D,在这种情况下,你得到的只是''(但继续阅读,除非我们当然添加if line == '': break).