2013-03-27 46 views
5

我在program.py以下代码:sys.stdin关不上按Ctrl-d

from sys import stdin 
for line in stdin: 
    print line 

我在运行里输入线,然后按Ctrl键+d,但该程序不退出。

这并不工作:

$ printf "echo" | python program.py 

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

+0

你使用什么外壳? – squiguy 2013-03-27 18:46:41

+0

哦,你需要输入'CTRL-D'两次。 – 2013-03-27 18:48:40

+0

并输入'CTRL-D'两次不起作用。 – 2013-03-28 21:33:33

回答

13

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

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

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

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

  • 终端本身(!),在其默认模式(“熟模式”),将其发送到过程,这也解释了之前读取数据的一条线就是输入按Ctrl +d没有在一行中间输入时的任何效果。

这个例子避免了第一个问题,这是你所需要的,如果你想要的是检测按Ctrl + d类型为自己的路线:

import sys 

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

你让每一个与线最后'\n',除了当“线”来自Ctrl + D,在这种情况下,你只得到''(但除非读过,我们加if line == '': break)。