Forum: Mikrocontroller und Digitale Elektronik Raspberry Python Keyboard interrupt abfangen


von Günter Dennig (Gast)


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)

von Martin S. (strubi)


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.

von Dirty-Flag (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.