1
私はwxPythonアプリケーションを持っています。 SIGTERMとSIGINTに "close"ボタンがクリックされたように応答するようにしたい。しかし、私がsignal.signal(signal.SIGTERM, exit_handler)
を使ってシグナルをバインドすると、イベントがメインアプリケーションにグラフィカルに送信された後にのみ実行されます(ボタンをクリックする、メニューを開くなど)。どのように私はこれを回避し、イベントがキャッチされるとすぐにハンドルを実行できますか?コードのwxPython処理SIGTERM/SIGINT
関連部分:
class MyFrame(wx.Frame):
def __init__(self, parent, title):
# ...
self.Bind(wx.EVT_CLOSE, self.signal_handler)
signal.signal(signal.SIGTERM, self.signal_handler)
signal.signal(signal.SIGINT, self.signal_handler)
# ...
app = wx.App(redirect=False, clearSigInt=False)
frame = MyFrame(None, "Hello World")
app.MainLoop()
これは、信号の呼び出しは、任意の関数の外に移動し、任意のWX呼び出しの前に実行された場合でも発生します。
このように動作する理由を理解するのに役立ちます。IIRC、Pythonのシグナルは発生時に捕捉されますが、Pythonコードの実行時にのみ処理されます。したがって、プログラムがMainLoopでイベントを待っている間に信号が発生した場合、何かが制御をPythonコードに戻すまで(イベントをPythonコードのハンドラにディスパッチするなど)何も処理が行われない限り何も実行されません。上記のように、コントロールがMainLoopを離れて定期的にPythonコードに入り、シグナルハンドラを呼び出すことができるようにする方法の1つです。 – RobinDunn
@RobinDunn本当にありがとう! –