2016-03-24 15 views
0

Ich habe ein wenig Python-Code zu versuchen und machen Raw_Input fangen Tastatur Interrupts. Wenn ich den Code in dieser Funktion benutze, funktioniert es einwandfrei. Aber wenn ich es in meinem Programm ausführe, wird die print-Anweisung nie gemacht, was anzeigt, dass der Tastatur-Interrupt nicht abgefangen wird. Das Programm versucht zu beenden und schlägt fehl, bis es zu SIGKILL eskaliert, was natürlich gut funktioniert. Meine Vermutung ist, dass irgendwo anders der Tastaturinterrupt abgefangen wird und die Ausnahme überhaupt nicht läuft. Meine Frage ist, wo würde solch ein Interrupt wahrscheinlich auftreten, und wie kann ich verhindern, dass er diesen unterbricht. Mein Plan war, eine leichte Verzögerung zwischen dem Programm, das eine Tastaturunterbrechung fängt und sich selbst tötet, hinzuzufügen, um hier einen Augenblick zu geben, um zu fangen.Catching Keyboard Interrupt mit Raw-Eingang

Irgendwelche Ideen geschätzt

Dank!

import sys 
def interruptable_input(text=''): 
    '''Takes raw input, but accepts keyboard interrupt''' 
    try: 
    return raw_input(text) 
    except KeyboardInterrupt: 
    print "Interrupted by user" 
    sys.exit() 
+3

Einfach diese Funktion innerhalb einer interaktiven 2.7.10-Interpreter-Sitzung aufrufen und dann STRG + C drücken, druckt korrekt "Unterbrochen von Benutzer" und wird für mich beendet. Ich kann nicht reproduzieren, was Sie meinen ... –

Antwort

0

Ich habe es verengt auf die folgenden:

import sys 
text='' 
try: 
    print raw_input(text) 
except KeyboardInterrupt: 
    print "Interrupted by user" 
    sys.exit() 

, die perfekt funktioniert, wenn ich es auf der Kommandozeile mit Python 2.7. Es lässt mich eine Eingabe auf der Konsole eingeben und wenn ich ctrl + Treffer c durch Benutzer druckt

bearbeiten intterupted: ich falsch verstanden Ihre Frage zunächst, aber wenn ich die Methode von Ihrem Beispiel verwenden und es nennen von einer anderen Methode das Ergebnis ist das gleiche

+1

Da ich anderen Code importiere, importierte ich andere Unterbrechungshandler, die in den Weg kamen. – David

1

Ich habe festgestellt, der Grund für mein Problem war ein anderer Interrupt-Handler das Skript vor dem KeyboardInterrupt wurde getötet. Ich löste es durch meine eigenen Interrupt-Handler für signal.SIGINT Einstellung wie folgt:

import sys 
import signal 
signal.signal(signal.SIGINT, signal_term_handler) 
def signal_term_handler(signal, frame): 
    '''Handles KeyboardInterrupts to ensure smooth exit''' 
    rospy.logerr('User Keyboard interrupt') 
    sys.exit(0) 

es ist etwas weniger direkt, aber es ist der Job zu erledigen. Jetzt wird raw_input() einfach sterben, wenn es dazu aufgefordert wird.