webentwicklung-frage-antwort-db.com.de

Python 3: EOF beim Lesen einer Zeile (Sublime Text 2 ist wütend)

while True:
    reply = input('Enter text')
    if reply == 'stop': break
    print(reply.upper())

Das Ergebnis war:

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]

Es ist nur in Sublime Text 2. Ich habe IDLE ausprobiert, die Befehlszeile ausprobiert, alles ist perfekt. Warum sollte Subleme mich anschreien?

Übrigens könntest du mir vielleicht auch erklären, was EOF in einer solchen Situation bedeuten kann. Natürlich habe ich in der Dokumentation gelesen, dass wenn EOF ist Wird von der Eingabe gelesen, wird der entsprechende Fehler ausgelöst. Ich möchte diese Situation modellieren. Geht es bei der Eingabe nur um die Tastatur? Wenn ja, welche Tastenkombination muss ich eingeben, um EOF zu erhalten?

Danke im Voraus.

33
Kifsif

Ich hatte das gleiche problem Das Problem mit der Standardkonsole von Sublime Text ist, dass sie keine Eingabe unterstützt.

Um das Problem zu lösen, müssen Sie ein Paket namens SublimeREPL installieren. SublimeREPL bietet einen Python Interpreter, der Eingaben akzeptiert.

Es gibt ein Artikel , das die Lösung im Detail erklärt.

GitHub Seite für SublimeREPL

35
Raghav Mujumdar

help(input) zeigt, welche Tastaturkürzel EOF erzeugen, nämlich Unix: Ctrl-D, Windows: Ctrl-Z+Return:

eingabe ([Eingabeaufforderung]) -> Zeichenfolge

Liest einen String von der Standardeingabe. Die nachgestellte Zeile wird entfernt. Wenn der Benutzer EOF (Unix: Ctl-D, Windows: Ctl-Z + Return) drückt, wird EOFError ausgelöst. Unter Unix wird GNU readline verwendet, wenn aktiviert: Die Eingabeaufforderungszeichenfolge wird, falls angegeben, vor dem Lesen ohne nachfolgende Zeile gedruckt.

Sie könnten es mit einer leeren Datei reproduzieren:

$ touch empty
$ python3 -c "input()" < empty
Traceback (most recent call last):
  File "<string>", line 1, in <module>
EOFError: EOF when reading a line

Sie können /dev/null Oder nul (Windows) als leere Datei zum Lesen verwenden. os.devnull Zeigt den Namen, der von Ihrem Betriebssystem verwendet wird:

$ python3 -c "import os; print(os.devnull)"
/dev/null

Hinweis: input() akzeptiert gerne Eingaben von einer Datei/Pipe. Sie brauchen stdin nicht, um mit dem Terminal verbunden zu sein:

$ echo abc | python3 -c "print(input()[::-1])"
cba

Behandle entweder EOFError in deinem Code:

try:
    reply = input('Enter text')
except EOFError:
    break

Oder konfigurieren Sie Ihren Editor so, dass beim Ausführen Ihres Skripts eine nicht leere Eingabe erfolgt, indem Sie beispielsweise eine angepasste Befehlszeile verwenden, sofern dies zulässig ist: python3 "%f" < input_file

10
jfs

EOF ist ein spezielles Außerbandsignal, das das Ende der Eingabe bedeutet. Es ist kein Zeichen (obwohl in den alten DOS-Tagen 0x1B wie EOF gehandelt hat), sondern ein Signal vom Betriebssystem, dass die Eingabe beendet wurde.

Unter Windows können Sie EOF durch Drücken von Ctrl+Z an der Eingabeaufforderung. Dadurch wird das Terminal angewiesen, den Eingabestream zu schließen, wodurch dem laufenden Programm ein Wert von EOF angezeigt wird. Beachten Sie, dass bei anderen Betriebssystemen oder Terminalemulatoren normalerweise EOF signalisiert wird mit Ctrl+D.

Bei Ihrem Problem mit Sublime Text 2 scheint stdin nicht mit dem Terminal verbunden zu sein, wenn Sie ein Programm in Sublime ausführen. Infolgedessen beginnen die Programme mit einer Verbindung zu einer leeren Datei (wahrscheinlich nul). oder /dev/null). Siehe auch Python 3.1- und Sublime Text 2-Fehler .

10
nneonneo

Ab sofort ist die einzige Lösung die Installation von SublimeREPL.

Um die Antwort von Raghav zu erweitern, kann es ziemlich ärgerlich sein, jedes Mal, wenn Sie ein Skript mit Eingaben ausführen möchten, den Befehl Tools-> SublimeREPL-> Python-> Run aufzurufen :

Um es zu aktivieren, gehe zu Preferences-> Key Bindings - User und kopiere es dort hinein:

[
    {"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"
        }
    },
]

Natürlich müssten Sie nur das Argument "Tasten" ändern, um die Verknüpfung auf das zu ändern, was Sie möchten.

5
Matthew R.