サーバー バックエンドや科学計算プログラムなど、長時間実行される Python プログラムには特別な注意が必要です。 Ctrl C を使用して実行中のプログラムを終了するなど、特定の操作を実行するときは、早期に終了する必要がある場合があります。通常、この状況には 2 つの可能性が考えられます。1 つは、プログラムにエラーがあり、調整のためにプログラムを停止する必要があることです。もう 1 つは、プログラム自体は正しいが、プログラムの実行が遅すぎるか、早く終了したい場合です。このシナリオでは、多くの場合、対応する計算結果を保持したいと考えます。ただし、データの保存にサードパーティのデータ ストレージ形式を使用する場合は、継続的なストレージをサポートしていない可能性があり、プログラムの実行完了後に結果を保存するのが一般的です。プログラムが途中で終了した場合、結果を保存するには特別な手段が必要です。
まず、比較的単純なケースを見てみましょう: 数字を出力する通常のプログラムです。1 秒ごとに数字を出力します。Python のシグナルを使用して、この終了シグナルをキャプチャできます。 。
# signal_exit.py import signal import sys def signal_handler(signal, frame): print ('\nSignal Catched! You have just type Ctrl+C!') sys.exit(0) if __name__ == '__main__': import time signal.signal(signal.SIGINT, signal_handler) for x in range(100): time.sleep(1) print (x)
このプログラムを途中で実行し、同時に Ctrl C を押すと、次の結果が得られます:
$ python3 signal_exit.py
0
1
2
^C
信号をキャッチしました! Ctrl C を入力するだけです!
この結果は、プログラムの実行中に Ctrl C の外部操作をキャプチャしたことを示しています。操作がそれに応じて処理された後でのみ、プログラムは終了します。なお、このときsys.exit(0)の終了操作を追加しないと、プログラムは停止せずに実行を継続するため、異常終了信号をキャッチしても何も処理をしないのと同じことになります。
上記の例では、「動作の終了」という外部信号だけをキャプチャしましたが、さらに進めると、それを外部パラメータにキャプチャしたいとします。このときの出力番号と操作方法を教えてください。 signal.signal 関数自体は多くのパラメーターの受け渡しをサポートしていないため、対応する内部パラメーターを取得できるように、独自にクラスを作成し、signal_handler 関数をクラスのメンバー関数としてカプセル化することをお勧めします。例: 次のような場合:
# signal_exit.py import signal import sys import time class Printer: def __init__(self): self.x = 0 signal.signal(signal.SIGINT, self.signal_handler) def signal_handler(self, signal, frame): print ('\nSignal Catched! You have just type Ctrl+C! The last number is: {}'.format(self.x)) sys.exit(0) def run(self, counter=10): while self.x < counter: print (self.x) time.sleep(1) self.x += 1 if __name__ == '__main__': printer = Printer() printer.run(counter=100)
このとき、プログラムの実行中に Ctrl C を同時に押すと、結果は次のようになります:
#$ python3 signal_exit.pyご覧のとおり、成功しました。最後の出力パラメータがキャプチャされました。0
1
2
3
^C
シグナルをキャッチしました! Ctrl C を入力するだけです! 最後の数字は: 3
以上がPython3でCtrl+C終了信号をキャプチャする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。