Подтвердить что ты не робот

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?

Спасибо заранее.

4b9b3361

Ответ 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]