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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.