Python: чтение из stdin с помощью «for _ in sys.stdin» требует двух Ctrl + D для выхода? - PullRequest
0 голосов
/ 06 июня 2018

Этот вопрос относится только к Python 2.7.Я использую Linux.Вопрос касается следующей трехстрочной программы Python.

import sys
for line in sys.stdin:
   print line

Вопрос 1: Когда я запускаю программу и печатаю ввод, почему программа ничего не печатает, когда я нажимаю клавишу ввода?Он печатается только после того, как я нажму Ctrl + D.

Вопрос 2. После нажатия Ctrl + D, почему программа не закрывается?Нажатие Ctrl + D один раз печатает все, что я набрал до сих пор (как упоминалось в вопросе 1).Я должен нажать Ctrl + D еще раз, чтобы выйти.Я думал, что Ctrl + D должен был отметить конец файла sys.stdin?Но, видимо, нет: я могу набрать кучу вещей, нажать Ctrl + D, чтобы напечатать, снова набрать кучу вещей, снова нажать Ctrl + D и т. Д.

Вопрос 2 (дополнительно): Когда яперенаправить файл в программу, в отличие от ввода непосредственно в терминал, программа завершается правильно - то есть мне не нужно «заканчивать файл дважды», дважды нажав Ctrl + D.Почему ввод в терминале отличается?

Вопрос 3: Почему эта программа работает так, как ожидалось в Python 3?(то есть он отражает то, что я набирал при каждом нажатии клавиши ввода) Что изменилось?

Я ожидаю, что хороший ответ на этот вопрос объяснит, что такое итератор, возвращаемый sys.stdin в цикле for, иименно то, что делают итератор и интерпретатор Python.Другие веб-сайты, похоже, смутно указывают, что "for line in sys.stdin" читает весь файл перед выполнением цикла for, но не объясняет, почему и как это работает, почему он не работает таким образом вPython 3, и почему мне нужно дважды нажать Ctrl + D на терминале.

...