5

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

from sys import stdin
for line in stdin:
    print line

我运行,输入行,然后按Ctrl+ D,但程序没有退出。

这确实有效:

$ printf "echo" | python program.py 

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

4

1 回答 1

15

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

另外,还有缓冲的问题——三级!

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

  • 默认情况下,C 级标准输入文件有一个行缓冲区。

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

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

import sys

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

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

于 2013-03-27T20:29:44.827 回答