2011-12-20 11 views
3

私はPythonスクリプトでファイルロックを使用しています(実行の単一インスタンスを制御するため)。 http://code.google.com/p/pylockfile/ 私はfinally codeブロックでロックを解除します。 しかし、スクリプトが閉じている、例えば、それを実行している端末を閉じると、finallyブロックは実行されず、ファイルはロックされたままです。スクリプトのアンロードイベント(デストラクタ)

どのようにpythonスクリプトのデストラクタイベントを捕捉するのですか?

答えて

2

この件に関しては、this blog postを参照してください。 Windowsではwin32apiを使用し、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!' 

を、それがコールバック機能を検証するためのファイルを作成します。