#python #python-3.x #itertools #keyboardinterrupt
#python #python-3.x #python-itertools #keyboardinterrupt
Вопрос:
Что-то такое простое, как
import itertools
list(itertools.count())
похоже, не реагирует на прерывания с клавиатуры, т.Е. Нажатие CTRL C:
$ python Python 3.7.8 (по умолчанию, 20 июля 2020, 19:59:47) [GCC 10.1.0] в Linux Введите "справка", "авторское право", "кредиты" или "лицензия" для получения дополнительной информации. >>> импортировать itertools >>> список(itertools.count()) ^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^ [1] Остановленный python $ ps Время ввода-вывода CMD 755703 пункта / 13 00:00:00 bash 757204 очка /13 00:00:03 python 757230 пунктов / 13 00:00:00 ps $ kill -INT 757204 $ ps Время ввода-вывода CMD 755703 пункта / 13 00:00:00 bash 757204 очка /13 00:00:03 python 757261 pts/ 13 00:00:00 ps $ kill -TERM 757204 $ ps Время ввода-вывода CMD 755703 пункта / 13 00:00:00 bash 757204 очка /13 00:00:03 python 757268 пунктов / 13 00:00:00 ps $ kill -УНИЧТОЖИТЬ 757204 $ ps Время ввода-вывода CMD 755703 пункта / 13 00:00:00 bash 757283 очка / 13 00:00:00 ps [1] Убитый python $
Почему?
Комментарии:
1. Не уверен, что эта ссылка помогает.
2. @AbdulNiyasPM Да, это так, спасибо.
3. И в дополнение к проблеме: внутренне Python улавливает все сигналы и сохраняет их, чтобы позже запустить их в главном потоке интерпретатора Python (например, в Linux сигнал может быть доставлен / запущен в любом потоке). Состояние сигнала проверяется интерпретатором при запуске кода python, но если интерпретатор не запускается, потому что мы находимся внутри функции C, и эта функция никогда не проверяет наличие сигналов, тогда сигнал просто будет сохранен на неопределенный срок. Я ожидал бы, что только для сигналов, которые специально перехватываются, но SIGINT всегда перехватывается и повторно вызывается как KeyboardInterrupt.