2016-07-25 1 views
0

Everytime I нажмите CTRL-C, когда я бегу программа он показывает, какую линию он выполнял, а затем говорит:Как отображать сообщение, если пользователь нажимает CTRL C или использует клавиатуру Interupt?

Keyboard Interrupt 

Однако, я бегу программа, которая присоединяет информацию в текстовые файлы. Это кто-то нажимает CTRL-C во время, что он только добавит, что код должен был сделать, прежде чем он был прерван.

Я слышал о try and except, но это работает, если я назову его в начале, и кто-то нажимает CTRL C во время фазы пробуждения?

Как сделать так, что, если в любое время в программе кто-то нажимает CTRL-C не будет запускать программу, вернуть все, что было до сих пор, и сказать:

Exiting Program 
+0

вам нужно захватить обработчик^C и реализовать функцию выключения, если не выполнить его. –

+0

Можете ли вы разместить его в качестве ответа и описать, что вы имеете в виду. –

+0

http://stackoverflow.com/questions/4205317/capture-keyboardinterrupt-in-python-without-try-except здесь способ справиться с этим :) просто найти бит –

ответ

2

Дайте ему попробовать сам:

Это работает (если код выполняется слишком быстро на машине добавить ноль в итераторе в for цикла):

a = 0 

try: 
    for i in range(1000000): 
     a = a + 1 
except (KeyboardInterrupt, SystemExit): 
    print a 
    raise 

print a 

Это не работает, потому что данные сохраняются в файле между ними. Блок try не отменяет сохранение данных в файл.

a = 0 

try: 
    for i in range(1000000): 
     if a == 100: 
      with open("d:/temp/python.txt", "w") as file: 
       file.write(str(a)) 

     a = a + 1 
except (KeyboardInterrupt, SystemExit): 
    raise 

Это работает. Данные сохраняются только в конце.

a = 0 

try: 
    for i in range(1000000): 
     a = a + 1 
except (KeyboardInterrupt, SystemExit): 
    raise 

with open("d:/temp/python.txt", "w") as file: 
    file.write(str(a)) 

Поэтому подготовить информацию в пределах try блока и сохранить потом.

Другая возможность: сохранить временный файл резервной копии с исходными данными и переименовать файл резервной копии в исходное имя файла в исключающем блоке.

+0

Спасибо. Я попробую это, как только я получу шанс –

+0

Когда я пишу в файл, требуется некоторое время. Что делать, если он генерирует и готовит информацию, а затем, когда начинает писать после исключения, а кто-то нажимает ctrl-c? –

+0

Ну, в какой-то момент вы должны начать писать в файл. Если вы удалите содержимое старого файла перед записью новых данных, они будут потеряны. Если этого недостаточно, сохраните файл резервной копии до конца программы. Или добавьте новые данные в конец файла и удалите старое содержимое из файла в конце. Однако удаление файла резервной копии или удаление старого содержимого может занять некоторое время; если нажата комбинация Ctrl + C, вы не можете отменить ее. –