我在program.py中有以下代码:
from sys import stdin
for line in stdin:
print line
我跑,输入行,然后按 Ctrl + D ,但程序不会退出。
这确实有效:
$ printf "echo" | python program.py
为什么按 Ctrl + d 时程序不会退出? 我正在使用Fedora 18终端。
答案 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
)。