Python小技!whileループ中のキー操作を受け付ける方法

  • このエントリーをはてなブックマークに追加

Pythonでwhileループを使う時、停止条件にキーボードからの入力情報を使いたい時が稀にあります。ここではキー操作でwhileループを抜ける方法を紹介します。

こんにちは。wat(@watlablog)です。
Pythonのwhileループは様々なプログラムで使いますが、ここではキーボードの入力を停止条件に使う方法を紹介します

ループをキー操作で抜けたい3つの状況

通常のプログラムでは「何か処理を実行して、結果を得る」という事がほとんどだと思いますが、ループをキー操作で抜けたい状況とはどんな時でしょうか?

①動画撮影

まず1つ目の状況は、動画撮影時です。

動画は決まった時間を指定して撮影することも可能ですが、スマホで動画を撮影する時のようにユーザがボタンを使って撮影の開始と終了を指定するパターンが圧倒的に多いと思います。

これは正にキー操作でループの停止を指定している処理になりますね。

プログラムで停止処理を書かず、コードの実行を強制的に終了させてしまうと今まで取得した情報が消えてしまうため、キー操作に対応させておくことは意外と重要です。

②録音(波形収録)

次は録音を始めとした波形収録時です。

PythonのPyAudioで音声を録音する簡単な方法」では、PyAudioを使ってPCのマイク入力から波形を収録してみましたが、この時は録音時間を指定したコードになっていました。

先ほどの①動画撮影の時と同じ理由で、実験等の波形収録もユーザが任意のタイミングで収録の開始と終了を指示したい状況は多々ありますよね。

市販のデータロガーFFTアナライザには必ずといって良いほど「マニュアルモード」、もしくは「マニュアルトリガ」という使い方がありますが、それもユーザの操作(UI上の操作、もしくはキーボード操作)をイベントの分岐に使っているだけなんですよね。

この状況も、プログラム的に停止処理を書いておかないと録音したデータが無くなってしまうので、キー操作でループを抜けることはやはり重要ですね。

③シミュレーションのリアルタイムモニタ

もう無いだろ…と思いましたがまだまだキー操作でループを抜けたい状況はあるみたいです。

3つめはシミュレーションのコーディングをしている人向けですが、シミュレーション結果のリアルタイムモニタを停止させたい時にも今回の話はピッタリです。

当WATLABブログの「シミュレーション」カテゴリでは、「Pythonで1自由度非減衰系の自由振動シミュレーション」に代表されるように、微分方程式を数値計算で処理するプログラムも紹介しています。

数値計算は時に解が収束せず、発散してしまう状況になり得ます。

そのような場合はイタレーション毎の残差をリアルタイムにモニタして、「あ~、ダメだこりゃ!」と思った時に止められるようにしておいた方が便利ですよね。

しかし、長い時間計算したシミュレーション結果はとっておきたいもの。キー操作で適切に停止処理した後に結果を保存するプロセスは入れておきたいですよね。

失敗したシミュレーション結果からも次につながる検討はできますからね!

これまで紹介した3つの状況意外にも、人によって千差万別の状況にキー操作でループを抜ける処理が必要になってくると思います。

しかし、そのどの状況も「ループをただ止めたいのではなく、ループ後の処理も行いたい」という事に変わりはないと考えられます。

Pythonでwhileループをキー操作で抜ける方法

Ctrl+CのKeyboardInterruptで止める

外部のライブラリパッケージを何も使わないでキーボードの入力によるループ停止をするには「KeyboardInterrupt」という例外処理を利用する方法があります。

その方法を以下のコードで示します。

このコードを実行中に「Ctrl + C」を押せば、それが中断指令になりループを抜けますが、except KeyboardInterruptがあれば例外処理としてコード全体が止まることなく処理の続きを書くことができます。

但し、KeyboardInterruptはPyCharm等のIDE上で実行中は「Ctrl + C」を中断指令とは認識しませんでした。

PyCharmで実行中に「Ctrl + C」を入力したら単にコードがハイライトされるだけでした。
方法はあるのかな?

しかし、コマンドプロンプトで.pyファイルを実行することで「Ctrl + C」を中断指令と認識してくれ、目的である「ループを途中で抜け、かつ処理をそのまま続ける」という動作をさせることができました。

僕の実行環境はWindowsですが、コマンドプロンプトでPythonプログラムを実行する方法は「基本!PythonのHelloWorldをコマンドで実行する方法」にまとめてありますので、忘れてしまった人は是非参照してみて下さい。

僕もいつもIDEで実行しているからこのやり方は忘れていました。

以下がコードを実行し、「Ctrl + C」でループを抜けた時の画面キャプチャです。

whileループをKeboardInterruptで止める

しっかりとループが中断され、その後の処理も行われていることがわかりました。

まとめ

本ページではややイレギュラーな使い方と思いきや割と需要のある「whileループをキー操作で抜ける」方法を紹介しました。

キーボードからの中断指令と例外処理を使って実現する方法でしたが、ちょっとしたことであればこの方法でも問題ないと思います。

もっと良い方法があるかも知れないけど、今回は例外処理の使い方を習得できました!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメント

コメントを残す

*