sys.stdin не закрывается на ctrl-d

У меня есть следующий код в 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 имеет странный эффект. Он не закрывает входной поток, но только вызывает fread() уровня C fread() чтобы вернуть пустой результат. Для обычных файлов такой результат означает, что файл уже завершен, но допустимо читать больше, например, чтобы проверить, добавил ли кто-то еще больше данных в файл.

Кроме того, есть проблемы буферизации – три уровня из них!

  • Итерация Python по файлу блокирует буферизацию. Избегайте его читать из интерактивных потоков.

  • файл stdin уровня C по умолчанию имеет строковый буфер.

  • сам терминал (!) в своем режиме по умолчанию («приготовленный режим») считывает одну строку данных перед отправкой в ​​процесс, что объясняет, почему ввод Ctrl + D не имеет никакого эффекта при вводе в середине линия.

В этом примере избегается первая проблема, которая вам нужна, если все, что вам нужно, это обнаружение Ctrl + D, введенное в качестве собственной строки:

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

Вы получаете каждую строку с конечным '\n' , кроме того, когда «строка» получается из Ctrl + D , и в этом случае вы получаете только '' (но чтение продолжается, если, конечно, мы не добавляем, if line == '': break ).