¿Cómo capturar SIGINT en Python?
En este artículo, aprenderemos cómo capturar SIGINT en Python y qué se debe hacer después de capturarlo.
Cuando el módulo de señal recibe señales, realiza una determinada acción. Además de eso, puede capturar la interrupción del usuario a través del teclado usando SIGINT.
Módulos necesarios
Módulo de señal
El término "señal" se refiere al proceso mediante el cual un programa puede recibir información del sistema operativo. Además, las señales se envían al programa cuando el sistema operativo detecta eventos específicos. Al ejecutar el siguiente comando en el terminal, se puede instalar el módulo de señal:
pip install signal
Módulo de sistema
El módulo sys en Python es el que ofrece varias funciones y variables para alterar diferentes partes del entorno de ejecución de Python. El módulo sys se puede instalar con el comando:
pip install os-sys
Módulo de tiempo
El módulo de tiempo de Python permite a los usuarios trabajar con el tiempo y registrar información sobre el tiempo. El módulo de tiempo normalmente viene preinstalado con Python, por lo que no es necesario instalarlo; pero, si no fue así, puede usar el siguiente comando para instalarlo:
pip install python-time
Ahora veremos la implementación de la captura de SIGINT en Python paso a paso.
Implementación paso a paso
Paso 1: Importar bibliotecas
En primer lugar, debemos importar todas las bibliotecas requeridas usando la palabra clave import. Entre ellas se encuentran las bibliotecas de señal, sistema y suspensión.
# importing signal and sys modules
import signal
import sys
# importing sleep function from the time module
from time import sleep
Paso 2: crear una función
Ahora creamos una función que, en caso de interrupción del teclado, se llamará aceptando dos argumentos cualesquiera. En este caso se han tomado como argumentos sig y frame.
# creating a function that accepts the two arguments
# it is called when the user makes a keyboard interruption
def signalHandling(signal, frame):
Paso 3: Definir controladores personalizados
Aquí usamos la función signal.signal() para definir controladores personalizados que deben llamarse cuando se recibe una señal. Además, definimos signal.SIGINT, que provoca una interrupción al escribir Ctrl+C o Ctrl+F2 en el teclado.
signal.signal(signal.SIGINT, signalHandling)
Paso 4: Imprimir mensaje aleatorio
A continuación, imprima cualquier mensaje aleatorio con unas pocas líneas para que el usuario sepa qué hacer si se interrumpe el teclado.
# printing random message
print(' printing random messages')
Paso 5: establecer el tiempo de sueño
Por último, establezca el tiempo de suspensión de Python en una cantidad aleatoria de segundos.
# sleep time
sleep(time in sec)
Nota
El programa tiene un inconveniente: si lo está ejecutando en Windows, puede detenerlo y capturar SIGINT presionando Ctrl y F2, pero si lo está ejecutando en Linux, puede detenerlo presionando < b>Ctrl y C al mismo tiempo.
Capturando SIGINT en Python
Algoritmo (pasos)
A continuación se detallan los algoritmos/pasos a seguir para realizar la tarea deseada. −
Utilice la palabra clave import para importar los módulos signal y sys.
-
Utilice la palabra clave import para importar la función sleep del módulo de tiempo.
Cree una variable e inicialice su valor con 1 (se utiliza para representar el número de veces que se ejecuta el bucle).
Utilice while True para realizar un bucle un número infinito de veces.
Utilice bloques try-except para manejar errores/excepciones.
Imprimir el recuento del número de veces que se ejecuta el bucle imprimiendo la variable anterior.
Utilice la función sleep() para dormir durante un número aleatorio de segundos entre la impresión de cada número pasándole el número como argumento.
Incremente el valor del recuento de ejecución del bucle en 1.
Utilice el bloque except para manejar la excepción de interrupción del teclado.
Imprima cualquier mensaje si se produce una excepción de interrupción del teclado.
Utilice la función exit() del módulo sys para cerrar/salir del programa.
Ejemplo
El siguiente programa para capturar SIGINT usando excepciones try/catch:
# importing signal and sys modules
import signal
import sys
# importing sleep function from the time module
from time import sleep
# initializing variable with value 1 to count the number of times the loop is executed
k = 1
# looping infinite times using a while loop
while True:
# using try-except blocks for handling errors/exceptions
try:
# Printing the count of the number of times the loop is executed
print(k)
#sleeping for a random number of seconds time between printing of a number
sleep(0.5)
# Incrementing the loop execution count by 1
k += 1
# Handling the keyboard interruption exception using except block
except KeyboardInterrupt:
# printing any message if keyboard interruption exception occurs
print("The loop has stopped!!")
# closing/exiting the program
sys.exit()
Producción
Tras la ejecución, el programa anterior generará el siguiente resultado:
1
2
3
4
5
6
7
8
9
10
11
12
13
The loop has stopped!!
En este programa, usamos una declaración try-catch para manejar las excepciones del teclado. Mientras ejecutamos un bucle creciente de números en el bloque try, detectamos la interrupción del teclado en el bloque catch.
Conclusión
En este artículo, aprendimos cómo usar Python para capturar SIGINT. Aprendimos cómo usar declaraciones try/catch para lograr lo mismo. Las declaraciones try and catch se pueden utilizar para manejar excepciones como división por 0 e interrupción del teclado, etc.