Почему я не могу прерывать Python с клавиатуры из списка (itertools.count())?

#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.