2013-09-25 87 views
13

Tôi hiện có mã cơ bản chạy vòng lặp vô hạn trong khi thu thập dữ liệu từ người dùng. Thường xuyên cập nhật từ điển/danh sách dựa trên nội dung của tệp văn bản. Để tham khảo:Kết thúc vòng lặp vô hạn

while (True): 
    IDs2=UpdatePoints(value,IDs2) 
    time.sleep(10) 

Về cơ bản, vấn đề của tôi là tôi không biết khi nào tôi muốn điều này kết thúc, nhưng sau khi vòng lặp while này chạy Tôi muốn sử dụng các thông tin thu thập được, không mất nó bằng cách đâm chương trình của tôi. Có một cách đơn giản, thanh lịch để chỉ đơn giản là thoát ra khỏi vòng lặp while bất cứ khi nào tôi muốn? Một cái gì đó như nhấn một phím nào đó trên bàn phím của tôi sẽ là tuyệt vời.

Trả lời

38

Bạn có thể thử gói mã mà trong một thử/trừ khối, bởi vì bàn phím ngắt chỉ là trường hợp ngoại lệ:

try: 
    while True: 
     IDs2=UpdatePoints(value,IDs2) 
     time.sleep(10) 
except KeyboardInterrupt: 
    print('interrupted!') 

Sau đó, bạn có thể thoát khỏi vòng lặp với CTRL-C.

+0

Dude các bạn thật tuyệt vời. điều này làm việc. – Blessoul

+0

Tôi phải nói, đây là một trong những cách sử dụng gọn gàng cho một khối thử/ngoại trừ tôi đã thấy. Tôi có thể thử mẫu này để gỡ lỗi. – reem

+0

Điều này không hoạt động trong Python 3.5 – dopatraman

4

Tôi nghĩ giải pháp đơn giản nhất là bắt số KeyboardInterrupt khi số interrupt key is pressed và sử dụng để xác định thời điểm dừng vòng lặp.

except KeyboardInterrupt: 
    break 

Bất lợi khi tìm ngoại lệ này là nó có thể ngăn người dùng chấm dứt chương trình trong khi vòng lặp vẫn đang chạy.

+0

CTRL + BREAK là khóa siêu ngắt, ít nhất là trên Windows. –

6

Bạn có thể sử dụng ngoại lệ. Nhưng bạn chỉ nên sử dụng ngoại lệ cho những thứ không được cho là xảy ra. Vì vậy, không cho điều này.

Đó là lý do tại sao tôi recommand tín hiệu:

import sys, signal 
def signal_handler(signal, frame): 
    print("\nprogram exiting gracefully") 
    sys.exit(0) 

signal.signal(signal.SIGINT, signal_handler) 

bạn nên đặt này trên đầu của chương trình của bạn và khi bạn nhấn ctrl + c bất cứ nơi nào trong chương trình của bạn nó sẽ đóng cửa một cách duyên dáng

Mã giải thích :

Bạn nhập syssignals. Sau đó, bạn thực hiện một hàm thực thi khi thoát. sys.exit(0) dừng chương trình với mã thoát 0 (mã nói, mọi thứ đều tốt).

Khi chương trình lấy SIGINT hoặc bằng ctrl-c hoặc bằng lệnh giết trong thiết bị đầu cuối, chương trình sẽ tắt máy một cách duyên dáng.

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