In grundlegenden Programmen, die den 'gekochten' Modus verwenden, wie zum Beispiel cat
, Ctrl+Dwird der tty-Layer als eof- Zeichen angehängt - er wird nicht direkt an den Prozess gesendet, sondern erzeugt einen 'EOF'-Zustand, wodurch der Prozess plötzlich eine 0- empfängt. Byte resultiert aus seinem read(stdin)
Aufruf. (Der Prozess könnte nur die Bedingung notieren und trotzdem fortfahren.)
Theoretisch ist Python davon nicht betroffen, da Python Readline verwendet. Es verwendet das Terminal im 'cbreak'-Modus und lässt Readline die Behandlung aller Sonderzeichen, einschließlich Strg + D, durchführen. (Das heißt, wenn Sie die Taste drücken, wird nur "\ x04" von read zurückgegeben, was dann intern von Readline-Bindungen behandelt wird.)
Readline bindet jedoch automatisch dieselben Steuerzeichen, die bereits auf der Ebene tty gebunden sind, und hat keine Möglichkeit, dies von Python aus zu steuern. (Obwohl es eine ~ / .inputrc -Option hat, scheint es in Python ignoriert zu werden.)
Gibt es eine Möglichkeit, zu verhindern, dass Python beendet wird, wenn Strg-D gedrückt wird ?;
Es scheint also, dass es keine Möglichkeit gibt, Pythons Readline daran zu hindern, Ctrl + D als EOF zu behandeln, es sei denn, die tty-Schicht ist an etwas anderes gebunden (jedoch nicht vollständig ungebunden). Die einzige Option ist, das EOF-Zeichen auf der Ebene tty (using ) zeitweise als etwas anderes als Strg + D zu definieren und beim Beenden auf den korrekten Wert zu definieren.stty eof
Versuchen Sie, dies in Ihre $ PYTHONSTARTUP-Datei einzufügen:
if True: import atexit, os os.system("stty eof ^X") atexit.register(lambda: os.system("stty eof ^D"))
(Beachten Sie, dass das vollständige Undefinning eof
hier nicht funktioniert. Wenn Readline den Wert null findet, wird standardmäßig Strg + D angenommen.)
Unabhängig davon kann ich die
...
Eingabeaufforderung beenden und zur Eingabeaufforderung zurückkehren,>>>
ohne den von mir eingegebenen Code auszuführen, wenn ich eine nicht übereinstimmende Klammer eingebe.
Drücken Ctrl+C. Python akzeptiert SIGINT, wie dies bei den meisten Shells der Fall ist.