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.
- Bash или GoogleCL: новая строка в строковом параметре
- Python sys.argv вне диапазона, не понимаю, почему
- Открытие Pycharm от терминала с помощью текущего пути
- Как проверить, завершена ли печать PDF в командной строке linux
- проверка JSON из командной строки с использованием `python -m jsontool` дает« Нет объекта JSON, который может быть декодирован »
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
).
- Есть ли флаг командной строки для установки PYTHONHOME?
- Как заставить pytest ждать (ручного) действия пользователя?
- sys.argv не принимает предоставленный аргумент в python 3
- Вызов скрипта python из командной строки дает синтаксическую ошибку, когда класс ничего не наследует, почему?
- Python: как запускать тесты, выполненные с помощью unittest
- Как флаг -m отличается между Python 2 и 3?
- Могу ли я передать «\ t» на python из командной строки?
- python читает в нескольких значениях ключа (dict) из командной строки в переменную
- Можно ли запускать python SimpleHTTPServer только на localhost?
- Интерактивная оболочка python в 16 раз быстрее командной строки – что случилось?
- Python csv reader: как подключить вывод к другому скрипту с помощью командной строки