Как отобразить сообщение, если пользователь нажимает CTRL C или использует прерывание с клавиатуры?

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

Keyboard Interrupt

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

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

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

Exiting Program

person Nick M.    schedule 25.07.2016    source источник
comment
вам нужно захватить обработчик ^ C и реализовать функцию выключения, чтобы не обрабатывать его.   -  person Marc B    schedule 25.07.2016
comment
Можете ли вы опубликовать это как ответ и описать то, что вы имеете в виду.   -  person Nick M.    schedule 25.07.2016
comment
stackoverflow.com/questions/4205317 / вот способ справиться с этим :) просто поищите немного   -  person Marko Mackic    schedule 25.07.2016
comment
Это не говорит мне, как вернуть код, как если бы он никогда не запускался.   -  person Nick M.    schedule 25.07.2016


Ответы (1)


Попробуйте сами:

Это работает (если код выполняется на вашем компьютере слишком быстро, добавьте ноль в итератор цикла 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 и затем сохраните.

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

person Michael Westwort    schedule 25.07.2016
comment
Спасибо. Я попробую это, как только у меня появится шанс - person Nick M.; 26.07.2016
comment
Когда я пишу в файл, это занимает некоторое время. Что, если он сгенерирует и подготовит информацию, а затем когда он начнет писать после исключения, и кто-то нажмет ctrl-c? - person Nick M.; 26.07.2016
comment
Что ж, в какой-то момент вы должны начать писать в файл. Если вы удалите старое содержимое файла перед записью новых данных, они будут потеряны. Если вам этого недостаточно, сохраните файл резервной копии до конца программы. Или добавьте новые данные в конец файла и удалите старое содержимое из файла в конце. Однако удаление файла резервной копии или стирание старого содержимого также может занять некоторое время; если нажать Ctrl + C, то вы тоже не сможете отменить. - person Michael Westwort; 26.07.2016