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