Python3: Ctrl-cで割り込み処理

怪奇!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がやってくれればいいのに……などと思いつつシコシコと後処理を書くのであった。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次