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

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

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

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

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

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

Danke euch allen.
Das meiste habe ich verstanden.

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