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)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.