2016-03-30 2 views
11

REPLでは通常、無限ループにsigint(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を参照してください。 –