Обработка выхода из функции при остановке программы пользователем
Есть программа следующей структуры:
def compute_res(fails=5):
res = []
for i in range(1, 1000000):
try:
x = str(do_long_stuff())
except LongStuffException:
fails -= 1
if fails == 0:
return res
res.append(x)
return res
res = compute_res()
with open('file.txt', 'w') as file:
file.writelines(res)
Как можно добавить сюда обработку остановки скрипта, которая заключается в возврате собранного на текущий момент res, чтобы он сохранился в файле, а не потерялся (как это сделано для исключений do_long_stuff, но попытка сейчас только 1)?
Остановка может быть закрытием окна/Ctrl+C/kill и т.п., что может сделать пользователь, системные ошибки типа "накрылся компьютер" не надо обрабатывать.
atexitиfinally-- отрабатывает всегда, а мне надо вернутьresтолько при остановке, иначе продолжать его собирать.KeyboardInterrupt-- только Ctrl+C + на винде плохо работаетsignal-- непонятно, как вернутьres, + часть сигналов на винде не работают
По идее нужна какая-то комбинация подходов, чтобы работало на обеих системах.
Ответы (1 шт):
Можно сделать while flag: цикл и установить в signal_handler(signum, frame) этот флаг в False с помощью nonlocal.