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.
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.
Durch Drücken von STRG-c wird nur eine neue Eingabeaufforderung in einer neuen Zeile gedruckt.
%Vor%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:
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% Füge das einfach in die Klasse Console(cmd.Cmd)
:
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).
Ich bevorzuge die Signalmethode, aber mit nur pass. Es ist mir nicht wirklich wichtig, den Benutzer mit irgendetwas in meiner Shell-Umgebung aufzufordern.
%Vor%Tags und Links python