2011-12-20 3 views
3

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

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

ответ

2

См. this blog post по этому вопросу. Он использует 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!' 

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