Захват 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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