Kontrolliertes Ende nach KeyboardInterrupt

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Donnerstag 28. Februar 2008, 19:24

Kürzlich habe ich einem der Programme hier im Forum etwas entdeckt, das ich leider nicht mehr wiederfinde ...

Beim Abbruch eines (Konsolen-)Programms mittels <Strg>-<C> wurde das vom Programm abgefangen, so dass vor dem tatsächlichen Terminieren z.B. noch Daten gesichert werden konnten.

Ergänzende Frage dazu: Gibt es so etwas auch für <Strg>-<D> ?
BlackJack

Donnerstag 28. Februar 2008, 19:29

Du kannst den `KeyboardInterrupt` abfangen wie jede andere Ausnahme auch.

Strg-D (unter Windows Strg-Z) veranlasst das Terminal sein Ende der Pipe zu schliessen, die bei `sys.stdin` rein kommt. Das müsste man mit `sys.stdin.closed` testen können.
lunar

Donnerstag 28. Februar 2008, 20:20

Alternativ kann man unter auch das signal-Modul benutzen, um SIGINT abzufangen.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Freitag 29. Februar 2008, 16:42

Müsste ja auch mit atexit gehen.
MfG
HWK
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Freitag 29. Februar 2008, 17:01

Habe gerade so etwas in einem Projekt drin, also schnell gepastet:

Code: Alles auswählen

import logging
import signal

def initialize_signal_handler(parent):
        # set signal handler for keyboard interruptes
        signal.signal(signal.SIGTERM, parent._onexit) # term
        signal.signal(signal.SIGABRT, parent._onexit) # abort
        signal.signal(signal.SIGINT, parent._onexit)  # keyboard interrupt

class foo(object):
    def __init__(self, ...):
        ....
        initialize_signal_handler(self)

    def _onexit(self, signum, frame):
        ...
        logging.error("\n\nCaught signal %s, %s!" % (signum, frame))
HTH
Christian
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Freitag 29. Februar 2008, 22:13

Danke euch allen.
Das meiste habe ich verstanden.

Vorläufig genügt mir die "kleine Lösung" über das Abfangen der entsprechenden exception.
Antworten