怪奇!ChatGPTに聞いたことのメモ帳と化したマイブログ!
というのはいいとして、PythonスクリプトでCtrl-Cで割り込んだときに特定の処理をさせたいスニペット。
環境
- Python 3.9.16
- macOS 12.6.3
コード
マジでChatGPTが出力したまんまのため若干気が引けつつ……。
import signal
import sys
import time
def keyboard_interrupt_handler(signal, frame):
print("\nCtrl-Cが押されました。特定の処理を実行します。")
# ここに特定の処理を追加してください。
sys.exit(0)
# SIGINTシグナル(キーボード割り込み)のハンドラを設定
signal.signal(signal.SIGINT, keyboard_interrupt_handler)
print("プログラムが実行されています。Ctrl-Cを押してください。")
while True:
time.sleep(1)
実行したらこんな感じ。
ええやん。
sys.exit()とexit()
そういえばあまり気にしてなかったけれど、sys.exit()とexit()って何が違うの?と思って聞いてみたらけっこうちゃんと違っていた。
Pythonの exit() と sys.exit() は、プログラムの実行を終了するために使用される2つの関数です。しかし、これらの関数には重要な違いがあります。
まず、 exit() はPythonの組み込み関数であり、 sys.exit() は sys モジュールに定義された関数です。
exit() は os._exit() を呼び出すことでプログラムを強制終了します。これにより、プログラムが完全に終了されるため、後処理などが実行されません。また、 exit() を呼び出すことができるのは、インタラクティブなPythonセッションなど、プログラムを実行している環境が os._exit() を呼び出すことを許可する場合のみです。
一方、 sys.exit() は、例外 SystemExit を発生させることでプログラムを終了します。この場合、Pythonインタプリターは例外をキャッチして、後処理を実行します。また、引数を渡すことができ、戻り値として指定した値を持つ SystemExit 例外を発生させることができます。
簡単に言うと、 exit() はプログラムを完全に終了し、 sys.exit() は例外を発生させてプログラムを終了し、後処理を実行します。どちらを使うべきかは、プログラムの状況によって異なります。通常、 sys.exit() を使用してプログラムを終了することが推奨されます。
あ、なるほど……。コマンドインタプリタ呼び出してあれこれしているときはexit()でいいけど、プログラムの中ではちゃんとsys.exit()使おうってことか……。exit()は後処理しないんやね。なので、リソースの解放がうまくいかないこともあるようだ。適当に使っていいものではなかった。。。
僕は本当に阿呆だなぁ……全部ChatGPTがやってくれればいいのに……などと思いつつシコシコと後処理を書くのであった。
コメント