Benutzer-Werkzeuge

Webseiten-Werkzeuge


python:signalhandling
  • Es gibt prinzipiell 2 verschiedene Ansätze
    • Handling direkt des Signals
    • Exception catchen
  • u.a. kann das genutzt werden um KeyboardInterrupt (SIGINT) abzufangen

Exceptions

  • die meisten Signale führen (wenn nicht umgebogen) zu einer Exception
  • Problem ist, dass man meist nicht weiß wann das Signal im Code auftritt

Lösen kann man das, in dem man den try-Except-Block einfach um den ersten Methoden-Aufruf schreibt den man macht, denn aller weiterer Code wird durch diese Methode aufgerufen und damit läuft die Exception auch bis zu diesem Punkt „hoch“.

def something():
    do something
    
try:
    if __name__ == __main__:
        something()
except KeyboardInterrupt:
     Some exception handling

In obigem Beispiel wird die KeyBoardInterrupt-Exception immer abgefangen, auch wenn zu dem Zeitpunkt Code von der Methode „something“ ausgeführt wird - da die Exception bis zum Methodenaufruf „hochläuft“.

Wird ein weiteres mal Ctrl+C gedrückt während man im Exception-Handling ist, wird die Exception logischerweise nicht mehr abgefangen. Deswegen sollte man im except-Block das signal per „signal.signal(signal.SIGINT, signal.SIG_IGN)“ blockieren (siehe nächste Sektion für Details).

Signal-Handling

  • Python erlaubt es Call-Back-Methoden zu definieren die ausgeführt werden wenn ein Signal eintritt
  • einmal definiert werden sie immer aufgerufen, egal an welcher Stelle im Code die Ausführung ist
    • natürlich nur, bis sie anders definiert werden
import signal
import time

def handlermethod(arg1, arg2):
    print("Abgefangen")
    print('Argumente:', arg1, arg2)

signal.signal(signal.SIGINT, handlermethod)

time.sleep(60)

In obigem Beispiel wird das Auftreten von SIGINT im ganzen Programm abgefangen.
Kommt es zu SIGINT wird der handler „handlermethod“ aufgerufen und nach dessen Abarbeitung mit dem normalen Code fortgefahren (sprich mit sleep).

python/signalhandling.txt · Zuletzt geändert: 2019/06/28 10:20 von root