Ctrl-Cで中断できないようにする
次のようにすることで、Pythonスクリプトの実行中はCtrl-Cを受け付けないようにできます。
import signal import time ## SIGINTシグナルを無視 signal.signal(signal.SIGINT, signal.SIG_IGN) ## 15秒間待ち続ける(Ctrl-Cで止められない) time.sleep(15)
この方法はシグナルを扱うOSであれば動作するはずです。しかしOSによってはシステムコール処理中にCtrl-Cを受け付けてしまうため、Pythonスクリプトが中断されてしまうのを防げない可能性があります。
Windowsの場合
たとえばWindowsでは、先のプログラムは実行できますが、次のようにCtrl-Cで中断できてしまいます。
Traceback (most recent call last): File "test.py", line 5, in ? time.sleep(15) IOError: [Errno 4] Interrupted function call
厳密に言えばCtrl-Cで中断したのではなく、システムコールが中断したためIOError例外が発生して中断したということです。このIOError例外をトラップして再度処理をやりなおす(このプログラムであればsleep(15)を呼び出す)対策もありますが、たとえば「多数のファイルを保存中にCtrl-Cで中断したくない」というケースを考えると、Ctrl-Cを押したら再度最初のファイルから書き込みをやり直すことになってしまい、あまり好ましい対策ではありません。
結局Windowsの場合、シグナルを使わず、次のようにイベントハンドラを設定してCtrl-Cを無視する方法が適しています。ただしこれはpywin32が必要です。
import win32api import win32con def consoleCtrlHandler(ctrlType): if ctrlType == win32con.CTRL_C_EVENT: return 1 return 0 win32api.SetConsoleCtrlHandler(consoleCtrlHandler, True)
もしCtrl-Breakによる中断も防ぎたい場合は、条件式の部分を
ctrlType in (win32con.CTRL_C_EVENT, win32con.CTRL_BREAK_EVENT)
のようにすればいいでしょう。