Захват SIGINT с использованием исключения KeyboardInterrupt работает в терминале, а не в скрипте.Python

Программы на Python
Anonymous
Захват SIGINT с использованием исключения KeyboardInterrupt работает в терминале, а не в скрипте.

Сообщение Anonymous »

Я пытаюсь перехватить SIGINT (или прерывание клавиатуры) в программе Python 2.7. Вот как выглядит мой тест скрипта Python:

Код: Выделить всё

#!/usr/bin/python

import time

try:
time.sleep(100)
except KeyboardInterrupt:
pass
except:
print "error"
Далее у меня есть сценарий оболочки test.sh:

Код: Выделить всё

./test & pid=$!
sleep 1
kill -s 2 $pid
Когда я запускаю сценарий с помощью bash, sh или чего-то еще bash test.sh, тест процесса Python продолжает работать и его невозможно убить с помощью SIGINT. А когда я копирую команду test.sh и вставляю ее в терминал (bash), тест процесса Python закрывается.

Я не могу понять, что происходит, и мне хотелось бы это понять. Итак, в чем разница и почему?

Речь идет не о том, как перехватить SIGINT в Python! Согласно документации – это способ, который должен работать:


Python по умолчанию устанавливает небольшое количество обработчиков сигналов: SIGPIPE ... и SIGINT транслируется в исключение KeyboardInterrupt


Он действительно перехватывает KeyboardInterrupt, когда SIGINT отправляется командой kill, если программа запускается непосредственно из оболочки, но когда программа запускается из сценария bash, запущенного в фоновом режиме, кажется, что KeyboardInterrupt никогда не вызывается.

Подробнее здесь: https://stackoverflow.com/questions/407 ... not-in-scr

Вернуться в «Python»