2013-03-27 49 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)。