SIGINT を処理できるようにするために必要な Python コードがいくつかありました。この目的のために、私は次のようなものを使用しました:
def mymethod(*params):
obj = MyObj(params)
try:
obj.do_some_long_stuff()
except KeyboardInterrupt:
obj.cleanup()
素晴らしく、本当に簡単です。やあ、パイソンはいいぞ!
ただし、他のシグナル、つまり SIGTSTP と SIGQUIT も処理する必要があります。私がやろうとしていることは、似たようなことです。SIGTSTP で何をしようとしているのかを示す疑似コードを次に示します (十分に明確であることを願っています)。
def mymethod(*params):
obj = MyObj(params)
try:
obj.do_some_long_stuff()
catch SIGINT:
obj.cleanup()
catch SIGTSTP:
log_stop(obj) # Log that we stopped obj (add info about stop signal happening in obj-specific log file )
raise SIGTSTP # Do normal SIGTSTP behavior as if we didn't catch the signal
ここに行く方法は、シグナルモジュールを使用することのようです。ただし、私の問題は、次のようにオブジェクトの状態にアクセスできなくなることKeyboardInterruptException
です。
import os
import signal
def handler(signum, frame):
print "I can't access obj from here anymore!" # How to access obj from here?
signal.signal(signum, signal.SIG_DFL)
os.kill(os.getpid(), signum) # Rethrow signal, this time without catching it
def mymethod(*params):
obj = MyObj(params)
signal.signal(signal.SIGTSTP, handler)
obj.do_some_long_stuff()
では、どうすればこれを解決できますか、つまり、作業中のオブジェクトにアクセスしながらシグナルを処理できますか?