電子機器・テクノロジー

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

kaomojiouji

当サイトで公開している顔文字は、アプリから採用したもの、少しアレンジしたもの、ミックスして作ったものがあり、コピペしてどんどん使用してくださいね。使用許可などはいりません。 そして当サイトは「全世界に発信!顔文字専門サイトです。」 Some of the emoticons published on this site are adopted from applications, some are slightly arranged, and some are a mix of the two, so please copy and paste them and use them as much as you like. You do not need permission to use them. And this site is "We are a site specializing in emoticons! This is a site specializing in emoticons."

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

私も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行を追加することから始めてみてください。安全なツールで、快適な業務効率化ライフを!

[参考文献リスト]

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