Seite 1 von 1

Kontrolliertes Ende nach KeyboardInterrupt

Verfasst: Donnerstag 28. Februar 2008, 19:24
von numerix
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> ?

Verfasst: Donnerstag 28. Februar 2008, 19:29
von BlackJack
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.

Verfasst: Donnerstag 28. Februar 2008, 20:20
von lunar
Alternativ kann man unter auch das signal-Modul benutzen, um SIGINT abzufangen.

Verfasst: Freitag 29. Februar 2008, 16:42
von HWK
Müsste ja auch mit atexit gehen.
MfG
HWK

Verfasst: Freitag 29. Februar 2008, 17:01
von CM
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

Verfasst: Freitag 29. Februar 2008, 22:13
von numerix
Danke euch allen.
Das meiste habe ich verstanden.

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