Поиск по сайту:

Как захватить SIGINT в Python?


В этой статье мы узнаем, как перехватить SIGINT в Python и что нужно сделать после его захвата.

Когда сигнальный модуль получает сигналы, он выполняет определенное действие. Кроме того, он может фиксировать вмешательство пользователя с помощью клавиатуры с помощью SIGINT.

Необходимые модули

Сигнальный модуль

Термин "сигнал" относится к процессу, с помощью которого программа может получать информацию от операционной системы. Кроме того, сигналы отправляются программе, когда операционная система обнаруживает определенные события. Выполнив следующую команду на терминале, можно установить сигнальный модуль:

pip install signal

Системный модуль

Модуль sys в Python предлагает несколько функций и переменных для изменения различных частей среды выполнения Python. Модуль sys можно установить с помощью команды —

pip install os-sys

Модуль времени

Модуль времени Python позволяет пользователям работать со временем и записывать информацию о времени. Модуль времени обычно поставляется с предустановленным Python, поэтому его не нужно устанавливать; но если это не так, вы можете использовать команду ниже, чтобы установить ее:

pip install python-time

Теперь мы шаг за шагом рассмотрим реализацию захвата SIGINT в Python.

Пошаговая реализация

Шаг 1. Импорт библиотек

Во-первых, мы должны импортировать все необходимые библиотеки, используя ключевое слово import. Среди них библиотеки signal, sys и Sleep.

# importing signal and sys modules 
import signal
import sys
# importing sleep function from the time module
from time import sleep

Шаг 2. Создание функции

Теперь мы создадим функцию, которая в случае прерывания работы клавиатуры будет вызываться, приняв любые два аргумента. В данном случае аргументами были приняты sig и frame.

# creating a function that accepts the two arguments 
# it is called when the user makes a keyboard interruption
def signalHandling(signal, frame):

Шаг 3. Определение пользовательских обработчиков

Здесь мы используем функцию signal.signal() для определения пользовательских обработчиков, которые должны вызываться при получении сигнала. Кроме того, мы определяем signal.SIGINT, который вызывает прерывание при нажатии Ctrl+C или Ctrl+F2 на клавиатуре.

signal.signal(signal.SIGINT, signalHandling)

Шаг 4: Печать случайного сообщения

Затем напечатайте любое случайное сообщение в несколько строк, чтобы пользователь знал, что делать, если клавиатура прерывается.

# printing random message
print(' printing random messages')

Шаг 5: Установите время сна

Наконец, установите время сна Python на случайное количество секунд.

# sleep time 
sleep(time in sec)

Примечание

У программы есть одна загвоздка: если вы запускаете ее в Windows, вы можете остановить ее и перехватить SIGINT, нажав Ctrl и F2, но если вы запускаете ее в Linux, вы можете остановить ее, нажав Ctrl и F2. b>Ctrl и C одновременно.

Захват SIGINT в Python

Алгоритм (шаги)

Ниже приведены алгоритмы/шаги, которые необходимо выполнить для выполнения желаемой задачи. −

  • Используйте ключевое слово import, чтобы импортировать модули signal и sys.

  • Используйте ключевое слово import, чтобы импортировать функцию sleep из модуля времени.

  • Создайте переменную и инициализируйте ее значение 1 (оно используется для обозначения количества выполнений цикла).

  • Используйте while True для выполнения цикла бесконечное количество раз.

  • Используйте блоки try-Exception для обработки ошибок/исключений.

  • Печать количества раз, когда цикл выполняется, путем печати указанной выше переменной.

  • Используйте функцию sleep() для сна на случайное количество секунд между печатью каждого числа, передав ему это число в качестве аргумента.

  • Увеличьте значение счетчика выполнения цикла на 1.

  • Используйте блок кроме для обработки исключения прерывания клавиатуры.

  • Распечатайте любое сообщение, если возникнет исключение прерывания клавиатуры.

  • Используйте функцию exit() модуля sys, чтобы закрыть/выйти из программы.

Пример

Следующая программа для захвата SIGINT с использованием исключений 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()

Выход

При выполнении вышеуказанная программа сгенерирует следующий вывод:

1
2
3
4
5
6
7
8
9
10
11
12
13
The loop has stopped!!

В этой программе мы используем оператор try-catch для обработки исключений клавиатуры. Выполняя возрастающий цикл чисел в блоке try, мы уловили прерывание клавиатуры в блоке catch.

Заключение

В этой статье мы узнали, как использовать Python для захвата SIGINT. Мы узнали, как использовать операторы try/catch для достижения того же самого. Операторы Try и catch могут использоваться для обработки исключений, таких как деление на 0, прерывание клавиатуры и т. д.

Статьи по данной тематике: