我在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有一个奇怪的效果。它不会关闭输入流,而只是导致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
)。
CTRL-D
。 - RobᵩCTRL-D
是不起作用的。 - Paul Draper