Verhindern, dass Python bei Strg-D beendet wird

428
Nathaniel

Ich finde, dass mir folgendes häufig passiert:

  1. Ich benutze Python in einer interaktiven Terminalsitzung
  2. Ich schreibe versehentlich etwas mit unausgeglichenen Klammern
  3. Python ...fordert mich auf, eine weitere Codezeile einzugeben
  4. Beim Versuch, zur Python-Eingabeaufforderung zurückzukehren, tippe ich instinktiv ein ctrl-D(Ende des Übertragungszeichens).
  5. Anstatt zur >>>Eingabeaufforderung zurückzukehren, wird der Python-Prozess sofort beendet und alle Daten aus meiner interaktiven Sitzung werden verloren

Ich möchte, dass dies nicht mehr geschieht. Daher sind meine Fragen:

  • Gibt es eine Möglichkeit, zu verhindern, dass Python beendet wird, wenn ctrl-Dgedrückt wird ?;

  • Dies ist vielleicht ein Wunschdenken, aber gibt es eine Möglichkeit ctrl-D, mich zur Python-Eingabeaufforderung zurückzubringen, wie ich es immer erwarte?

Ich benutze Python 3.6, das mit MacPorts auf einem Mac installiert ist, aber ich denke, das ist eine ziemlich plattformunabhängige Frage. Ich glaube, diese Installation verwendet die Gnu Readline-Bibliothek für die Benutzerinteraktion, falls dies relevant ist.

0

1 Antwort auf die Frage

0
grawity

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 eofhier 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.