2016-03-30 15 views
11

Trong REPL, chúng ta thường có thể làm gián đoạn một vòng lặp vô hạn với một sigint, tức là ctrl + c và lấy lại quyền kiểm soát trong trình thông dịch.Tại sao tôi không thể thoát khỏi vòng lặp vô hạn itertools này?

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

Nhưng trong vòng lặp này, ngắt có vẻ bị chặn và tôi phải giết quy trình gốc để thoát.

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

Tại sao lại như vậy?

+0

Lỗi có liên quan trong trình theo dõi Python: http://bugs.python.org/issue26351 –

Trả lời

10

Các KeyboardInterrupt được kiểm tra sau mỗi lệnh Python. itertools.repeat và thế hệ tuple được xử lý trong Mã C. Việc ngắt được xử lý sau đó, tức là không bao giờ.

+1

Thật vậy. 'list (itertools.repeat ('x'))' cũng treo trình thông dịch, nhưng đặt nó vào nền và gửi một tín hiệu 'TERM' đơn giản sẽ giết chính xác trình thông dịch. –

+0

lỗi hoặc tính năng? – wim

+4

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

Các vấn đề liên quan