5

Мой цикл while не выходит, когда нажата клавиша Ctrl + C. Это, похоже, игнорирует исключение KeyboardInterrupt. Часть цикла выглядит следующим образом:python exit бесконечный цикл while с исключением KeyboardInterrupt

while True: 
    try: 
    if subprocess_cnt <= max_subprocess: 
     try: 
     notifier.process_events() 
     if notifier.check_events(): 
      notifier.read_events() 
     except KeyboardInterrupt: 
     notifier.stop() 
     break 
    else: 
     pass 
    except (KeyboardInterrupt, SystemExit): 
    print '\nkeyboardinterrupt found!' 
    print '\n...Program Stopped Manually!' 
    raise 

Опять же, я не уверен, что проблема, но мой терминал никогда даже не печатает два предупреждения печати у меня есть в моем исключении. Может кто-нибудь помочь мне понять эту проблему?

+2

Ваш первый 'except KeyboardInterrupt' ловит исключение. Он не будет отображаться во втором 'except (KeyboardInterrupt, SystemExit)', если вы его повторно не поднимаете. – eumiro

+0

@eumiro - я прокомментировал первый KeyboardInterrupt и заменил содержимое исключения на «pass», но я все еще испытываю ту же проблему. Ctrl + C игнорируется (ps aux показывает, что процесс все еще запущен) – sadmicrowave

+0

@eumiro Я также попытался повторно поднять исключение KeyboardInterrupt, добавив 'raise KeyboardInterrupt()' в пределах первого 'except KeyboardInterrupt:' однако я «Я все еще испытываю одну и ту же проблему. – sadmicrowave

ответ

11

Заменить break заявление с raise заявление, как показано ниже:

while True: 
    try: 
    if subprocess_cnt <= max_subprocess: 
     try: 
     notifier.process_events() 
     if notifier.check_events(): 
      notifier.read_events() 
     except KeyboardInterrupt: 
     notifier.stop() 
     print 'KeyboardInterrupt caught' 
     raise # the exception is re-raised to be caught by the outer try block 
    else: 
     pass 
    except (KeyboardInterrupt, SystemExit): 
    print '\nkeyboardinterrupt caught (again)' 
    print '\n...Program Stopped Manually!' 
    raise 

Два утверждения печати в except блоков должны выполняться с «(снова)» появляется второй.

+0

Пока вы не спрашивали об этом, инструкция 'pass' в вашем коде создает так называемую прямую блокировку. Спин-блокиры потребляют процессор без необходимости и могут влиять на производительность всей системы. Есть способы избежать их. Изучите объекты 'Queue.Queue' для обмена данными между потоками и' select.select' или модуль 'multiprocessing' для обмена данными между процессами. – wberry

+0

Итак, мне приходит в голову, что моя основная проблема (я думал, что она не связана) - это то, что я дважды развил свой сценарий, чтобы «демонировать» его. В этом случае KeyboardInterrupt больше не подключается к одному и тому же терминалу (однако мой скрипт все равно будет печатать выходы на активном терминале). Есть ли способ использовать KeyboardInterrupt (или другой способ закончить мой скрипт вручную) в демоннизированной программе? – sadmicrowave

+0

В настоящее время я искал processid в выводе 'ps aux' и выполнял' sudo kill [pid] '; однако, это не изящно очищает мой код, прежде чем убить его. Мне нужно закрыть соединения с базой данных и удалить inotify часы, прежде чем убить программу. – sadmicrowave

 Смежные вопросы

  • Нет связанных вопросов^_^