2016-12-22 14 views
2

Если вы остановите скрипт python с помощью Ctrl + C, он выполнит любые окончательные блоки или будет ли он буквально остановить скрипт там, где он есть?Будет ли Python исполнять окончательный блок после получения Ctrl + C

+5

Вы не можете проверить это самостоятельно? –

+1

Он убивает его там, где он – Roman

+0

Я не понимаю, что значит ваш вопрос. Предлагаю вам прочитать: http://stackoverflow.com/help/how-to-ask и http://www.catb.org/~esr/faqs/smart-questions.html – Pitto

ответ

1

Да, это обычно вызывает исключение KeyboardInterrupt, но помните, что ваше приложение может быть неожиданно прекращено в любое время, поэтому вы не должны полагаться на это.

0

Да, по крайней мере под Linux он будет, и вы можете проверить его с помощью следующего Python 3 код:

import time 

try: 
    print('In try.') 
    time.sleep(1000) 
finally: 
    print(' <-- Note the Ctrl+C.') 
    for i in range(1, 6): 
     print('Finishing up part {} of 5.'.format(i)) 
     time.sleep(.1) 

Вот результат:

$ ./finally.py 
In try. 
^C <-- Note the Ctrl+C. 
Finishing up part 1 of 5. 
Finishing up part 2 of 5. 
Finishing up part 3 of 5. 
Finishing up part 4 of 5. 
Finishing up part 5 of 5. 
Traceback (most recent call last): 
    File "./finally.py", line 7, in <module> 
    time.sleep(1000) 
KeyboardInterrupt 
4

Ну, ответ в основном это зависит. Вот что на самом деле происходит:

  • Python выполняет код в try:... finally: блоке
  • с Ctrl-C излучается и переводится в KeyboardInterrupt Exception
  • обработка прерывается и управление переходит окончательно блокировать

Итак, на первый взгляд все работает так, как ожидалось. Но ...

Когда пользователь (а не вы, но другие ...) хочет прервать задачу, которую он обычно нажимает несколько раз Ctrl-C. Первый будет выполнять ветвление в блоке finally. Если в середине блока finally есть другой Ctrl-C, потому что он содержит slow операций, таких как закрытие файлов, новый KeyboardInterrupt будет поднят, и ничто не гарантирует, что весь блок будет выполнен, и вы можете иметь что-то вроде:

Traceback (most recent call last): 
    File "...", line ..., in ... 
    ... 
KeyboardInterrupt 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "...", line ..., in ... 
    ... 
    File "...", line ..., in ... 
    ... 
KeyboardInterrupt 

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

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