Raspberry Python Keyboard interrupt abfangen

Gast #5722340
Lesenswert?

hallo

ich hab in einem Python Script auf dem RaspberryPI eine Funktion 
eingebaut, die Keyboard interrupts erkennen und dann vor dem Beenden des 
Programmes noch einige Sachen ausführen soll.
Der Keyboard interrupt an sich funktioniert auch wie er soll. Das 
Problem ist aber, dass nun jegliche Beendigung des Programms über den 
exit_handler abgewickelt werden. D.h wenn ich in einer anderen Stelle 
des Programms einen quit() ausführe, wird auch der exit_handler gerufen. 
Wie kann ich das vermeiden?
Außserdem habe ich noch folgendes Problem: ich führe das Script über 
Putty aus, das über SSH mit dem Raspberry kommuniziert. Schließe ich nun 
Putty oder der Computer auf dem Putty läuft, stürtzt ab, wird der 
exit_handler nicht gerufen, die runtime selbst läuft aber anscheinend 
nicht mehr.



import atexit


def exit_handler():
    print "interrupt detected, program ending."
    sys.exit()


def main ():
    atexit.register (exit_handler)
#5722418
Lesenswert?

Moin,

was ist mit sowas?
1
>>> try:
2
...     dauerschleife()
3
... except KeyboardInterrupt:
4
...     print "Bin raus"

Für den Rest musst du allenfalls Signal-Handler installieren, sowas wie
1
def handler_sigpipe():
2
...
3

4
signal.signal(signal.SIGPIPE, handler_sigpipe)

Möglich, dass du auch zusätzlich socket.error oder IOError (wie oben mit 
'except') abfangen musst.

Dürfte aber nicht sonderlich robust sein, ssh hat schon mal längere 
Hänger und der Python-interpreter kriegt nicht immer die Signale richtig 
mit, besonders lustig wird's mit mehreren Threads.
Gast #5722487
Lesenswert?

In Summe bekommst du wohl am wenigsten Probleme, wenn du im Exit-Handler 
abfragst, was zu tun ist.

So ähnlich wie bei einem Texteditor. Jede Eingabe setzt ein Dirty-Flag. 
Der Exit-Handler überprüft, ob irgendwo Dirty-Flags gesetzt sind.

Bei diesen Überlegungen, wann man was aufräumen muss, übersieht man 
immer irgend etwas.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren