Forum: Mikrocontroller und Digitale Elektronik Raspberry Python Keyboard interrupt abfangen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Günter Dennig (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.