Обработка выхода из функции при остановке программы пользователем

Есть программа следующей структуры:

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

  1. atexit и finally -- отрабатывает всегда, а мне надо вернуть res только при остановке, иначе продолжать его собирать.

  2. KeyboardInterrupt -- только Ctrl+C + на винде плохо работает

  3. signal -- непонятно, как вернуть res, + часть сигналов на винде не работают

По идее нужна какая-то комбинация подходов, чтобы работало на обеих системах.


Ответы (1 шт):

Автор решения: user424033

Можно сделать while flag: цикл и установить в signal_handler(signum, frame) этот флаг в False с помощью nonlocal.

→ Ссылка