событие выгрузки сценария Python on (деструктор) - PullRequest
3 голосов
/ 20 декабря 2011

Я использую блокировку файлов в скрипте Python (для управления одним экземпляром его выполнения). http://code.google.com/p/pylockfile/ Я снимаю блокировку в блоке кода наконец. Но если скрипт закрывается, например, закрывая терминал, на котором он запущен, блок finally не выполняется и файл остается заблокированным.

Как перехватить событие деструктора скрипта Python в любом случае?

1 Ответ

2 голосов
/ 20 декабря 2011

См. в этом блоге на эту тему. Он использует win32api, когда под Windows, в то время как под Linux ловится сигнал SIGTERM. Чтобы проверить его работоспособность, может быть полезно записать что-то в файл в обработчике on_exit, как показано ниже. Поскольку фрагмент довольно краткий, я просто включу его (полный реквизит автора блога):

import os, sys
def set_exit_handler(func):
    if os.name == "nt":
        try:
            import win32api
            win32api.SetConsoleCtrlHandler(func, True)
        except ImportError:
            version = '.'.join(map(str, sys.version_info[:2]))
            raise Exception('pywin32 not installed for Python ' + version)
    else:
        import signal
        signal.signal(signal.SIGTERM, func)

if __name__ == '__main__':
    def on_exit(sig, func=None):
        f = open('log.txt', 'w')
        f.write('shutdown...')
        f.close()
        sys.exit()
    set_exit_handler(on_exit)
    print 'Press  to quit'
    raw_input()
    print 'quit!'

Если вы закроете терминал, на котором запущена эта программа, он создаст файл для проверки функциональности обратного вызова.

...