Завершение бесконечного цикла while
В настоящее время у меня есть код, который в основном запускает бесконечный цикл while для сбора данных от пользователей. Постоянное обновление словарей/списков на основе содержимого текстового файла. Для справки:
while (True):
IDs2=UpdatePoints(value,IDs2)
time.sleep(10)
В основном, моя проблема в том, что я не знаю, когда я хочу, чтобы это закончилось, но после этого цикла цикла я хочу использовать собранную информацию, а не потерять ее, разбив мою программу. Есть простой, элегантный способ просто выйти из цикла while, когда захочу? Что-то вроде нажатия определенной клавиши на моей клавиатуре было бы потрясающе.
Ответы
Ответ 1
Вы можете попробовать обернуть этот код в блок try/except, потому что прерывания клавиатуры - это только исключения:
try:
while True:
IDs2=UpdatePoints(value,IDs2)
time.sleep(10)
except KeyboardInterrupt:
print('interrupted!')
Затем вы можете выйти из цикла с помощью CTRL-C.
Ответ 2
Вы можете использовать исключения. Но вы должны использовать исключения только для вещей, которые не должны произойти. Поэтому не для этого.
Вот почему я рекомендую сигналы:
import sys, signal
def signal_handler(signal, frame):
print("\nprogram exiting gracefully")
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
вы должны поместить это в начало своей программы, и когда вы нажимаете ctrl + c, где бы вы ни находились в своей программе, он будет изящно закрыт
Обозначение кода:
Вы импортируете sys
и signals
.
Затем вы выполняете функцию, выполняемую при выходе. sys.exit(0)
останавливает программирование с кодом выхода 0 (код, который говорит, все шло хорошо).
Когда программа получает SIGINT либо с помощью ctrl-c, либо командой kill в терминале, программа будет отключена изящно.
Ответ 3
Я думаю, что самым легким решением было бы поймать KeyboardInterrupt, когда прервать клавишу и использовать это, чтобы определить, когда остановить цикл.
except KeyboardInterrupt:
break
Недостатком поиска этого исключения является то, что он может помешать пользователю завершить работу программы, пока цикл все еще запущен.