広告 電子機器・テクノロジー

Pythonでキー入力判定方法|実行中の暴走を3行で止める「緊急停止」実装術

マウスが勝手に画面を走り回り、クリックを連打する…。冷や汗をかきながら電源ボタンを長押しした経験、ありませんか?

私もPythonを始めた頃、同じ失敗をしました。自動化ツールにおいて「動かす技術」以上に大切なのが、「止める技術」です。特に業務で使うツールの場合、予期せぬ動作をした瞬間に停止できる「緊急停止ボタン(キルスイッチ)」の実装は、安全管理上の必須要件と言えます。

この記事では、難しい理屈は抜きにして、あなたのPythonスクリプトにたった3行で「Escキーを押したら即停止する機能」を追加する方法を伝授します。これで、もうパソコンを強制終了する恐怖から解放されましょう。

[著者プロフィール]

高橋 悟 (Satoru Takahashi)

業務改善エンジニア / Python自動化コンサルタント

中小企業で、Excelやブラウザ操作の自動化ツール導入を支援。「現場の非エンジニアがメンテナンスできるコード」にこだわり、自身も過去に無限ループでPCをフリーズさせた数々の失敗経験を持つ。現在はその教訓を活かし、安全なRPA構築のノウハウを発信している。


なぜ「input()」では自動化ツールを止められないのか?

「キー入力を待ちたいなら、input()関数を使えばいいのでは?」

Pythonを学習し始めたばかりの方が、最初につまずくポイントがここです。結論から言うと、標準のinput()関数は、動き続ける自動化ツールの制御には使えません。

なぜなら、input()関数は「ユーザーがEnterキーを押すまで、プログラムの全処理を一時停止させて待機する」という性質を持っているからです。

想像してみてください。あなたの作ったロボット(自動化ツール)が、Excelにデータを入力する作業をしているとします。もしプログラムの中にinput()を書くと、ロボットはその行に来た瞬間、作業の手を完全に止めてしまい、あなたがキーを叩くまで石のように固まってしまいます。これでは「作業をしながら、緊急停止の指令を待つ」という並行動作ができません。

私たちが実現したいのは、ロボットが手を動かし続けている最中でも、常に耳だけはあなたの指示(キー入力)に澄ませている状態です。これを実現するためには、Python標準の機能ではなく、OSのキーボードイベントを裏側で監視し続ける「外部ライブラリ」の力を借りる必要があります。


【Windows向け】keyboardライブラリで「緊急停止ボタン」を作る

ここからは、Windows環境で最も簡単に実装できる「keyboardライブラリ」を使った手法を解説します。

このライブラリは非常に直感的で、初心者でも扱いやすいのが特徴です。まずは、コマンドプロンプト(またはターミナル)で以下のコマンドを実行し、ライブラリをインストールしてください。

pip install keyboard

インストールができたら、いよいよ「緊急停止ボタン」の実装です。ここでは2つのパターンを紹介しますが、業務ツールとして安全性を高めるなら、後述する「パターンB(イベント駆動)」を強く推奨します。

パターンA:処理の合間に確認する(ポーリング方式)

ループ処理の中で、「今、キーが押されていますか?」と毎回確認する方法です。keyboard.is_pressed()関数を使います。

import keyboard
import time

print("処理を開始します。Escキーで停止します。")

while True:
    # 1. 業務処理(例:何かを表示する)
    print("作業中...")
    time.sleep(0.5)

    # 2. 安全装置:Escキーが押されていたらループを抜ける
    if keyboard.is_pressed('esc'):
        print("緊急停止しました")
        break

この方法はコードの流れが追いやすく理解しやすいですが、弱点があります。もし「1. 業務処理」に5秒かかる場合、その5秒間はキー入力を検知できません。あなたが必死にEscキーを連打しても、プログラムは5秒後のチェックポイントまで反応してくれないのです。

パターンB:即座に強制終了させる(イベント駆動方式)★推奨

そこで登場するのが、keyboard.add_hotkey()関数を使ったイベント駆動方式です。これは、メインの処理がどれだけ重くても、指定したキーが押された瞬間に強制的に割り込んで処理を実行します。

これこそが、私たちが求めている真の「キルスイッチ」です。

import keyboard
import sys
import time

# --- ここがキルスイッチ ---
# Escキーが押されたら、lambda関数内の処理(終了)を即座に実行
# sys.exit()でプログラム全体を強制終了させます
keyboard.add_hotkey('esc', lambda: sys.exit("緊急停止!"))
# ------------------------

print("処理を開始します。Escキーで即座に終了します。")

# メインの業務処理(無限ループでもOK)
while True:
    print("重い処理を実行中...")
    time.sleep(2) # たとえ処理中でも、Escを押せば即死します

is_pressed()関数が「確認」であるのに対し、add_hotkey()関数は「割り込み」です。 業務自動化ツールにおいては、どんな状況でも確実に停止できる後者の実装が、事故防止の観点で圧倒的に優れています。

💡 専門家の経験からの一言アドバイス

【結論】: 自動化ツールを作る際は、ロジックを書く前に、まずこの「キルスイッチ」を実装する癖をつけましょう。

なぜなら、開発中は予期せぬ無限ループが最も起こりやすいタイミングだからです。「完成してから安全装置をつけよう」と考えていると、テスト実行中にマウスが暴走し、保存していないコードごとPCを強制終了する羽目になります(私はこれで半日分の作業を失いました)。「まずは止める機能から」。これが鉄則です。


【Mac・汎用向け】pynputライブラリでの実装と注意点

Windowsユーザーであれば前述のkeyboardライブラリで十分ですが、Macユーザーや、OSを問わずに配布するツールを作る場合は事情が異なります。

実は、keyboardライブラリはWindows環境に特化しており、MacやLinuxでは管理者権限(sudo)が必要だったり、設定が複雑だったりします。 そこで、クロスプラットフォーム(多環境対応)で動作する「pynputライブラリ」の出番です。

keyboardライブラリとpynputライブラリは、どちらもキー入力を扱いますが、その得意分野とターゲット層が異なります。



👇 比較表:keyboardライブラリ vs pynputライブラリの比較

特徴keyboardライブラリpynputライブラリ
主なターゲットWindowsユーザー、初心者Macユーザー、配布用ツール開発者
導入難易度低(直感的)中(クラスやスレッドの理解が必要)
Macでの動作△(設定が複雑・不安定)◎(安定して動作)
管理者権限Windowsでは不要な場合が多いOSの設定(アクセシビリティ)に依存
推奨シーン自分用の業務効率化ツールチームに配布する本格的なアプリ

Mac環境や、より堅牢なツールを目指す場合は、以下のようにpynputを使ってキー入力を監視(リスニング)します。

from pynput import keyboard
import sys

def on_press(key):
    # Escキーが押されたか判定
    if key == keyboard.Key.esc:
        print("緊急停止!")
        # Falseを返すとリスナー(監視)が停止する
        return False

# リスナーを非ブロッキング(裏側)で起動
listener = keyboard.Listener(on_press=on_press)
listener.start()

# メイン処理
try:
    while True:
        if not listener.is_alive():
            sys.exit() # リスナーが止まっていたらプログラムも終了
        # ここに業務処理を書く
        pass
except KeyboardInterrupt:
    pass

コードの行数は増えますが、pynputはOSごとの挙動の違いを吸収してくれるため、配布用ツールを作る際には非常に頼もしい存在となります。


よくあるトラブルと解決策 (FAQ)

最後に、実装時によくあるトラブルとその解決策をまとめました。

Q1. ImportError: No module named 'keyboard' と出ます

A. ライブラリがインストールされていません。
コマンドプロンプトで pip install keyboard を実行してください。もしAnacondaなどの仮想環境を使っている場合は、その環境内でインストールする必要があります。

Q2. キーを押しても反応しません(Windows)

A. 管理者権限が必要な場合があります。
特定のアプリ(ゲームや一部の業務システム)を操作している最中は、Pythonスクリプト側も「管理者として実行」しないとキー入力を検知できないことがあります。VS Codeやコマンドプロンプトを右クリックし、「管理者として実行」してからスクリプトを動かしてみてください。

Q3. 1回押しただけなのに、何度も反応してしまいます(チャタリング)

A. time.sleepなどで待機時間を入れましょう。
is_pressedを使うポーリング方式の場合、コンピューターの処理速度が速すぎて、人間がキーを離す前の一瞬に何回も「押されている」と判定してしまうことがあります。検知した直後に time.sleep(0.2) などを入れて、少し待たせる処理を追加すると解決します。


まとめ

自動化ツール開発において、「動かす技術」と同じくらい、あるいはそれ以上に重要なのが「止める技術」です。

今回ご紹介したkeyboardライブラリのadd_hotkey関数を使えば、たった3行追加するだけで、あなたのツールに強力な「緊急停止ボタン」を実装できます。

  1. pip install keyboard でライブラリを入れる。
  2. keyboard.add_hotkey('esc', lambda: sys.exit()) を記述する。
  3. 安心して業務自動化ロジックを作り込む。

この3ステップで、暴走の恐怖から解放されましょう。まずは手元のスクリプトに、この3行を追加することから始めてみてください。安全なツールで、快適な業務効率化ライフを!

[参考文献リスト]

-電子機器・テクノロジー