2016-03-30 3 views
11

В REPL мы обычно можем прерывать бесконечный цикл с помощью сиг- нана, то есть ctrl + c и восстановить контроль в интерпретаторе.Почему я не могу вырваться из этого бесконечного цикла itertools?

>>> while True: pass 
... 
^CTraceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyboardInterrupt 
>>> 

Но в этом цикле прерывание, кажется, заблокировано, и я должен убить родительский процесс для выхода.

>>> *x, = itertools.repeat('x') 
^C^C^C^C^C^C^C^C^\^\^\^\^\^Z^Z^Z^Z 

Почему это?

+0

Релевантная ошибка в отслеживании Python: http://bugs.python.org/issue26351 –

ответ

10

KeyboardInterrupt проверяется после каждой инструкции Python. itertools.repeat и генерация кортежа обрабатывается в коде C. После этого прерывание обрабатывается, т. Е. Никогда.

+1

Действительно. 'list (itertools.repeat ('x'))' также зависает интерпретатор, но, помещая его в фоновом режиме и отправляя простой сигнал 'TERM', он корректно убивает интерпретатор. –

+0

ошибка или функция? – wim

+4

@wim: см. Http://bugs.python.org/issue26351. –

Смежные вопросы