マウスが勝手に画面を走り回り、クリックを連打する…。冷や汗をかきながら電源ボタンを長押しした経験、ありませんか?
私も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行追加するだけで、あなたのツールに強力な「緊急停止ボタン」を実装できます。
pip install keyboardでライブラリを入れる。keyboard.add_hotkey('esc', lambda: sys.exit())を記述する。- 安心して業務自動化ロジックを作り込む。
この3ステップで、暴走の恐怖から解放されましょう。まずは手元のスクリプトに、この3行を追加することから始めてみてください。安全なツールで、快適な業務効率化ライフを!
[参考文献リスト]
- keyboard PyPI - PyPI, The Python Package Index
- pynput Documentation - Read the Docs
- PyAutoGUI Documentation - Read the Docs (Fail-Safe機能について参照)