2013-09-25 28 views
13

Mam obecnie kod, który w zasadzie uruchamia nieskończoną pętlę while, aby zbierać dane od użytkowników. Ciągłe aktualizowanie słowników/list na podstawie zawartości pliku tekstowego. Dla porównania:Kończenie nieskończonej pętli while

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

Zasadniczo mój problem jest to, że nie wiem, kiedy chcę to do końca, ale po tej pętli while działa Chcę wykorzystać informacje zebrane, nie tracić go upaść mój program. Czy istnieje prosty, elegancki sposób na wyjście z pętli while, kiedy tylko chcę? Coś jak naciśnięcie pewnego klawisza na mojej klawiaturze byłoby niesamowite.

Odpowiedz

38

Można spróbować owijania tego kodu w próbie/z wyjątkiem bloku, ponieważ przerwania klawiatury to tylko wyjątki:

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

Następnie można wyjść z pętli z CTRL-C.

+0

Dude, jesteście niesamowici. to działało. – Blessoul

+0

Muszę powiedzieć, że jest to jeden z bardziej użytecznych sposobów na wypróbowanie/poza blokiem, który widziałem. Mogę wypróbować ten wzorzec do debugowania. – reem

+0

To nie działa w Pythonie 3.5 – dopatraman

4

Myślę, że najprostszym rozwiązaniem będzie złapanie KeyboardInterrupt, gdy interrupt key is pressed, i użyć go, aby określić, kiedy zatrzymać pętlę.

except KeyboardInterrupt: 
    break 

Wadą poszukiwania tego wyjątku jest to, że może uniemożliwić użytkownikowi przerwanie programu, gdy pętla jest nadal uruchomiona.

+0

CTRL + BREAK to klucz superprzerwania, przynajmniej w systemie Windows. –

6

Można użyć wyjątków. Ale powinieneś używać wyjątków tylko w przypadku rzeczy, które nie powinny się zdarzyć. Więc nie za to.

Dlatego polecam sygnały:

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

signal.signal(signal.SIGINT, signal_handler) 

należy umieścić to na początku programu i po wciśnięciu ctrl + c gdziekolwiek w programie będzie zamknięty wdzięcznie

Kod wyjaśnienie :

Importujesz sys i signals. Następnie tworzysz funkcję, która jest wykonywana przy wyjściu. sys.exit(0) zatrzymuje programowanie z kodem wyjścia 0 (kod, który mówi, wszystko poszło dobrze).

Gdy program otrzyma SIGINT albo przez ctrl-c, albo przez polecenie kill w terminalu, program zostanie wyłączony z wdziękiem.

Powiązane problemy