Python 3: EOF при чтении строки (Sublime Text 2 сердится)
while True:
reply = input('Enter text')
if reply == 'stop': break
print(reply.upper())
В результате получилось:
Enter text:Traceback (most recent call last):
File "C:\PythonProjects\5.py", line 2, in <module>
reply = input('Enter text:')
EOFError: EOF when reading a line
[Finished in 0.2s with exit code 1]
Это только в Sublime Text 2. Я попробовал IDLE, попробовал командную строку, все идеально.
Почему Subleme кричит на меня?
Кстати, может быть, вы также можете объяснить, что может означать EOF в такой ситуации. Конечно, я прочитал в документации, что если EOF считывается с ввода, возникает соответствующая ошибка. Я хотел бы моделировать эту ситуацию. Вводится ли только о клавиатуре? Если да, какую комбинацию клавиш следует вводить для получения EOF?
Спасибо заранее.
Ответы
Ответ 1
У меня была та же проблема. Проблема с консолью по умолчанию Sublime Text заключается в том, что она не поддерживает ввод.
Чтобы решить эту проблему, вам необходимо установить пакет SublimeREPL. SublimeREPL предоставляет интерпретатор Python, который принимает ввод.
Существует статья в которой подробно объясняется решение.
Страница GitHub для SublimeREPL
Ответ 2
EOF - это специальный внеполосный сигнал, который означает конец ввода. Это не символ (хотя в старые DOS-дни 0x1B действовал как EOF), а скорее сигнал от ОС, что вход закончился.
В Windows вы можете "ввести" EOF, нажав Ctrl+Z
в командной строке. Это сигнализирует терминалу о закрытии входного потока, который представляет EOF для текущей программы. Обратите внимание, что на других ОС или терминальных эмуляторах EOF обычно сигнализируется с помощью Ctrl+D
.
Что касается вашей проблемы с Sublime Text 2, кажется, что stdin
не подключен к терминалу при запуске программы в Sublime, и поэтому программы начинают с подключенного к пустым файлом (возможно, nul
или /dev/null
). См. Также Ошибка Python 3.1 и Sublime Text 2.
Ответ 3
help(input)
показывает, какие быстрые клавиши генерируют EOF, а именно Unix: Ctrl-D, Windows: Ctrl-Z+Return:
input ([приглашение]) → строка
Прочитайте строку со стандартного ввода. Затянувшаяся новая строка лишена. Если пользователь нажимает EOF (Unix: Ctl-D, Windows: Ctl-Z + Return), поднимите EOFError. В Unix используется readline GNU, если включена. Подсказка строка, если она задана, печатается без конечной новой строки перед чтение.
Вы можете воспроизвести его с помощью пустого файла:
$ touch empty
$ python3 -c "input()" < empty
Traceback (most recent call last):
File "<string>", line 1, in <module>
EOFError: EOF when reading a line
Вы можете использовать /dev/null
или nul
(Windows) как пустой файл для чтения. os.devnull
показывает имя, используемое вашей ОС:
$ python3 -c "import os; print(os.devnull)"
/dev/null
Примечание: input()
с радостью принимает входные данные из файла/трубы. Вам не нужно stdin
подключаться к терминалу:
$ echo abc | python3 -c "print(input()[::-1])"
cba
Либо дескриптор EOFError
в вашем коде:
try:
reply = input('Enter text')
except EOFError:
break
Или настройте свой редактор для предоставления непустого ввода, когда он запускает ваш script, например, используя настраиваемую командную строку, если это разрешено: python3 "%f" < input_file
Ответ 4
Похоже, на данный момент единственным решением остается установить SublimeREPL.
Чтобы продлить ответ на Raghav, может быть очень неприятно, если вы будете запускать команду script с помощью ввода команды Tools- > SublimeREPL- > Python- > Run, поэтому я разработал быстрый ключ которые могут быть удобными:
Чтобы включить его, перейдите в Preferences- > Key Bindings - User и скопируйте его там:
[
{"keys":["ctrl+r"] ,
"caption": "SublimeREPL: Python - RUN current file",
"command": "run_existing_window_command",
"args":
{
"id": "repl_python_run",
"file": "config/Python/Main.sublime-menu"
}
},
]
Естественно, вам просто нужно изменить аргумент "keys", чтобы изменить ярлык на все, что вам нужно.
Ответ 5
try:
value = raw_input()
do_stuff(value) # next line was found
except (EOFError):
break #end of file reached
Это, по-видимому, правильное использование raw_input при работе с концом потока ввода с входного канала.
[Послать ссылку] [1]