2016-03-30 40 views
11

Nella REPL, di solito è possibile interrompere un ciclo infinito con una sigint, ovvero ctrl + c e riprendere il controllo nell'interprete.Perché non riesco ad uscire da questo loop infinito di itertools?

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

Ma in questo ciclo, l'interrupt sembra essere bloccato e devo uccidere il processo genitore per scappare.

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

Perché è quello?

+0

Rilevante bug nel tracker Python: http://bugs.python.org/issue26351 –

risposta

10

Il KeyboardInterrupt viene controllato dopo ogni istruzione Python. itertools.repeat e la generazione della tupla viene gestita nel codice C. L'interruzione viene gestita in seguito, vale a dire mai.

+1

Infatti. 'list (itertools.repeat ('x'))' blocca anche l'interprete, ma inserendolo in background e inviando un semplice segnale TERM si uccide correttamente l'interprete. –

+0

bug o funzionalità? – wim

+4

@wim: vedi http://bugs.python.org/issue26351. –