Задержка прерывания клавиатуры в Python для важной части программы

Как можно задержать прерывание клавиатуры для важной части программы (в моем примере в цикле).

Я хочу загрузить (или сохранить) много файлов, и если это займет слишком много времени, я хочу завершить программу, когда последний файл будет загружен.

Нужно ли использовать сигнальный модуль как в ответе на прерывание клавиатуры Capture в Python без try-except? Могу ли я установить глобальную переменную в значение True с помощью обработчика сигнала и разорвать цикл, если оно равно True?

Исходный цикл:

for file_ in files_to_download:
    urllib.urlretrieve("".join(baseurl, file_), os.path.join(".", file_)) 

person Arpad Horvath    schedule 02.11.2012    source источник


Ответы (1)


Что-то вроде следующего может работать:

# at module level (not inside class or function)
finish = False
def signal_handler(signal, frame):
    global finish
    finish = True

signal.signal(signal.SIGINT, signal_handler)

# wherever you have your file downloading code (same module)
for file_ in files_to_download:
    if finish:
        break
    urllib.urlretrieve("".join(baseurl, file_), os.path.join(".", file_)) 
person Andrew Clark    schedule 02.11.2012
comment
Это легко. Я должен попробовать, а не спрашивать. - person Arpad Horvath; 02.11.2012
comment
@ArpadHorvath: если у вас есть несколько модулей в пакете, вы можете объединить обработчики сигналов в класс. Сделайте каждый обработчик classmethod, чтобы он мог легко устанавливать атрибуты класса, такие как cls.finish. Затем, например, проверьте SignalState.finish в своем цикле, если класс называется SignalState. - person Eryk Sun; 03.11.2012
comment
Я могу установить исходное состояние прерывания с помощью signal.signal(signal.SIGINT, signal.default_int_handler). Я должен установить свой обработчик перед важной частью, а после этого установить обработчик по умолчанию. Я прав? - person Arpad Horvath; 03.11.2012
comment
Я сделал модуль на основе ответа FJ и eryksun: gist.github.com/4006374 SafeInterruptHandler class имеет метод включения и выключения для включения и выключения специального поведения, а также метод декоратора для создания безопасных функций. Спасибо. - person Arpad Horvath; 03.11.2012