Bessere Handhabung von KeyboardInterrupt im Befehlszeileninterpreter cmd.Cmd

8

Wie kann ich dem Python-Befehl cmd.Cmd zum Erstellen einer benutzerdefinierten CLI mitteilen, die aktuelle Zeile abzubrechen und eine neue Eingabeaufforderung zu geben?

Hier ist ein minimales Beispiel:

%Vor%

Weitere Hilfe wird sehr geschätzt.

Originalfrage und weitere Details: [Derzeit sind die folgenden Vorschläge in diese Frage integriert - immer noch auf der Suche nach einer Antwort. Aktualisiert, um einen Fehler zu beheben.]

Ich habe seitdem versucht, den Handler auf eine Funktion außerhalb der Schleife zu verschieben, um zu sehen, ob sie flexibler ist, aber es scheint nicht zu sein.

Ich benutze Pythons cmd.Cmd-Modul , um meinen eigenen Kommandozeilen-Interpreter zu erstellen, um die Interaktion mit einer Software zu verwalten. Ich drücke oft ctrl + c und erwarte ein populäres Shell-ähnliches Verhalten, indem ich eine neue Eingabeaufforderung zurückgebe, ohne auf den getippten Befehl einzugehen. Es wird jedoch nur beendet. Ich habe versucht, KeyboardInterrupt Ausnahmen an verschiedenen Stellen im Code (Preloop, etc.) ohne Erfolg zu fangen. Ich habe ein wenig über Sigins gelesen, weiß aber nicht genau wie passt das hier zusammen.

UPDATE: Von den folgenden Vorschlägen habe ich versucht, das Signal zu implementieren, und zwar so, dass ctrl + c jetzt die CLI nicht verlässt, sondern die Nachricht druckt. Mein neues Problem ist jedoch, dass ich die Handler-Funktion (siehe unten) nicht dazu bringen kann, neben dem Drucken viel zu tun. Ich möchte, dass Strg + C im Grunde die aktuelle Zeile abbricht und mir eine neue Eingabeaufforderung gibt.

    
hodgkin-huxley 11.01.2012, 02:07
quelle

7 Antworten

8

Ich arbeite gerade an der Erstellung einer Shell mit dem Cmd-Modul. Ich wurde mit dem gleichen Problem konfrontiert, und ich fand eine Lösung.

Hier ist der Code:

%Vor%

Jetzt haben Sie einen richtigen KeyboardInterrupt-Handler (aka CTRL-C ) in der Shell.

    
Seb 16.11.2012, 10:02
quelle
3

Anstatt die Signalbehandlung zu verwenden, könntest du nur die KeyboardInterrupt fangen, die cmd.Cmd.cmdloop() erhöht. Sie können sicherlich die Signalverarbeitung verwenden, aber es ist nicht erforderlich.

Führen Sie den Aufruf von cmdloop() in einer while-Schleife aus, die sich selbst für eine KeyboardInterrupt -Ausnahme neu startet, aber aufgrund von EOF ordnungsgemäß beendet.

%Vor%

Durch Drücken von STRG-c wird nur eine neue Eingabeaufforderung in einer neuen Zeile gedruckt.

%Vor%     
Joel 22.01.2013 16:14
quelle
0

Als Antwort auf den folgenden Kommentar in diese Antwort :

  

Dies scheint bei einer Lösung zu konvergieren, aber ich weiß nicht, wie ich es in meinen eigenen Code integrieren soll (oben). Ich muss die "Super" -Linie herausfinden. Ich muss versuchen, dass dies irgendwann in der Zukunft funktioniert.

super() würde in dieser Antwort funktionieren, wenn Ihre Klasse object zusätzlich zu cmd.Cmd erweitert. So:

%Vor%     
deargle 02.05.2016 15:17
quelle
-1

Sie können das signal -Modul auschecken: Ссылка

%Vor%     
jdi 11.01.2012 02:26
quelle
-1

Sie können das CTRL-C-Signal mit einem Signalhandler . Wenn Sie den folgenden Code hinzufügen, verweigert der Interpreter das Beenden von CTRL-C:

%Vor%

Wenn Sie nicht nach jedem CTRL-C die EINGABETASTE drücken möchten, lassen Sie den Handler nichts tun, was das Signal ohne Auswirkung auffängt:

%Vor%     
miku 11.01.2012 02:26
quelle
-2

Füge das einfach in die Klasse Console(cmd.Cmd) :

ein %Vor%

Vergiss all die anderen Sachen. Das funktioniert. Es macht keine Schleifen innerhalb von Schleifen. Wenn es KeyboardInterrupt abfängt, ruft es do_EOF auf, führt aber nur die erste Zeile aus; Da Ihre erste Zeile in do_EOF return do_exit ist, ist das in Ordnung.
do_exit ruft postloop auf.
Es wird jedoch nur die erste Zeile nach cmd.Cmd.postloop(self) ausgeführt. In meinem Programm ist dies Ausdruck "\ n". Seltsamerweise, wenn du SPAM Strg + C drückst, wirst du sehen, dass es die zweite Zeile druckt, die normalerweise nur bei ACTUAL Exit gedruckt wird (Strg + Z, dann Enter, oder Eingabe in Exit).

    
Abei Villafane 27.03.2013 10:46
quelle
-2

Ich bevorzuge die Signalmethode, aber mit nur pass. Es ist mir nicht wirklich wichtig, den Benutzer mit irgendetwas in meiner Shell-Umgebung aufzufordern.

%Vor%     
Adam Cooley 29.07.2014 15:46
quelle

Tags und Links