HOWTO · Python
Python でキープレスを検出する方法
keyboard、pynput、readchar を使って Python でキーボード入力を検出する方法を学びます。キーを押すイベントと離すイベント、ターミナルでの単一キー入力も含まれます。
このページの内容
Python でキーボード入力を検出するには、入力の発生元に基づいてライブラリを選択します。keyboard はシステムレベルのフックを提供し、pynput はキーを押す操作と離す操作のコールバックを提供し、readchar は Enter を待たずにコマンドラインプログラムで 1 つのキーを読み取ります。選択したパッケージをインストールし、そのコールバックまたは読み取りループを自分のタスクに合わせて調整してください。以下のパッケージ固有の例はサードパーティのライブラリとキーボードまたは対話型ターミナルへのアクセスに依存するため、API のガイダンスとして示されており、キャプチャされた出力はありません。
Python で keyboard モジュールを使ってキープレスを検出する
パッケージ keyboard は、キーボードイベントを受け取るフックをインストールできます。プログラムを実行するのと同じ Python 環境に、python -m pip install keyboard でインストールしてください。一部のオペレーティングシステムでは、グローバルなキーボードフックに昇格した権限が必要な場合や、デスクトップ環境によって制限される場合があります。フックはキーを押すイベントと離すイベントの両方を受け取ります。押下を報告するタスクでは event.event_type == "down" でフィルタリングしてください。一般的な統合では、keyboard.hook(on_key_event) でコールバックを登録し、keyboard.wait("esc") で待機を続けます。待機が終了してもプロセスが他の作業を続ける場合は、keyboard.unhook_all() でフックを削除してください。イベント処理がプログラムの残りの部分を遅らせないよう、コールバックは短く保ってください。
この自己完結型の例は、サンプルのイベントレコードを使って、フックのコールバックが使うフィルタリングのロジックを示します。物理的なキーボードイベントは読み取りません。そのためには上記のパッケージ統合を使用してください。
events = [
{"name": "a", "event_type": "down"},
{"name": "a", "event_type": "up"},
]
for event in events:
if event["event_type"] == "down":
print(f"Key {event['name']} pressed")
Key a pressed
Python で pynput モジュールを使ってキープレスを検出する
プログラムがキーを押す操作と離す操作に別々のハンドラーを必要とする場合は pynput を使用してください。python -m pip install pynput でインストールします。リスナーは keyboard.Listener(on_press=on_press, on_release=on_release) で作成し、そのコンテキストマネージャーまたは start() で開始します。押下コールバックでは、文字キーは char 値を公開しますが、Escape などの特殊キーは公開しない場合があります。属性が存在し、None でないことを確認してから読み取ってください。離すコールバックでは、キーを keyboard.Key.esc と比較し、False を返すことでリスナーを停止できます。メインスレッドがリスナーの終了を待つ必要がある場合は join() を呼び出してください。このパッケージ固有のコールバックフローは、pynput が提供されたランタイムで利用できないため、ここでは実行されません。オペレーティングシステムの権限やデスクトップセッションの制限も、システム入力へのアクセスに影響する場合があります。
Python で readchar モジュールを使ってキープレスを検出する
一度に 1 つのキーが必要なコマンドラインプロンプトでは、readchar が、ユーザーが Enter を押す必要なくキーを読み取ります。python -m pip install readchar でインストールしてください。ループ内で readchar.readkey() を呼び出してターミナル入力を同期的に待ち、返されたキーを "q" と比較してループを終了します。返された他のキーは、届くたびに出力してください。これはターミナルでの操作に適しており、別のアプリケーションがフォーカスを持っている間にキーを監視するグローバルフックには適していません。矢印キーやその他の特殊キーは複数文字のシーケンスで表される場合があるため、それらを扱う際はターミナルとライブラリについて文書化された値と比較してください。このパッケージ固有の操作は、readchar が提供されたランタイムで利用できないため、ここでは実行されません。
結論
システムのキーボードイベントに反応するフックには keyboard を、キーを押す操作と離す操作のコールバックやリスナーのライフサイクルの明示的な制御がプログラムに合う場合は pynput を、シンプルな単一キーのコマンドラインプロンプトには readchar を選択してください。最初の 2 つはプロンプトの範囲を超えてイベントを待機し、オペレーティングシステムの権限に依存する場合があります。readchar はアクティブなターミナルから読み取るもので、グローバルな監視は提供しません。選択したパッケージをスクリプトを実行する環境にインストールし、Escape や q のような明確な停止条件を選んで、リスナーや読み取りループが予測可能な形で終了できるようにしてください。