概要
Mac環境でKeyboardライブラリが使いにくいという話です。回避策はあるものの、やや使いにくいです。
キーボード入力
Pythonでキーボード入力をしようとする場合、2つの手法が見つかる。
①input関数を使う
②keyboardライブラリを使う
①は2文字以上の文字とか数字を扱う。エンターキーで確定するまで、入力を受け付ける。②はデバイスとしてのキーボードを扱う。
この投稿では②を扱う。
keyboardライブラリのインストール
ターミナルからコマンドでインストールする。
pip install keyboard
pip show keyboard
Version: 0.13.5
プログラム例
よくあるコードは、こんな感じです。
また、保存するファイル名をkeyboard.py
にすると、エラーになります。
注意しなければ。
import keyboard
while True:
if keyboard.is_pressed("shift"):
print("shift")
break
しかし、通常のMac環境ではエラー13になると思います。
2つ理由があり、1つはターミナルにアクセス許可が与えられていない
ことです。これに関しては、Macがアクセス権を与える環境設定へ誘導してくれるので、さほど困ったことではないです。
もう1つはMacのセキュリティ(パスワードを盗むアプリ対策)によって、キーボードへのアクセスが制限されることです。とても不便です。これを回避するには、sudo
実行する必要がありますが、コマンド操作に慣れていないと、わからない人が多いと思います。一回、コマンドを入れてしまえば、上カーソルキーで履歴を辿れるので、多少はいいのですが。
また、sudo実行する際には、rootのパスワードを求められますが、普段のアカウントのパスワードと同じじゃないかなと思います。毎回入力する必要はないですが、10分ぐらい経過すると、またパスワードを聞いてくるので、面倒です。
うまく、実行できた場合、右のshiftキーを押すと、shiftと出力して終了します。左shiftは反応しません。
shift
の他に
enter
や
escape
が使えます。
回避策① sudo python3 xxxx.py
先の2つ目について、説明です。
管理者権限(root)で 都度Pythonを実行することが必要で、ターミナルから実行する必要があります。
前提として、cdやpwd、lsなどのコマンドで、フォルダの移動ができる必要があるでしょう。
sudo python3 myKeyboard.py
良くないことに、プログラム終了時に、入力したキーが、一気に入力されます。shiftキーは影響ないですが、enterキーの場合、1行改行されます。良くない仕様です。
プログラムを終了するには、Command+cもしくは、Command+zを押します。
回避策② sudo VS Code
Visual Studio Codeをsudo(root権限)で実行すれば、pythonもroot権限で動きました。起動時に、シェルの環境設定ファイルが見つからないという、エラーが出ますが、そのままpythonは動きました。
Visual Studio Code内のターミナルタブで、入力結果がわかります。デバッグの停止で、終了後、入力していたキーが一度に表示される問題は残っています。
Finderからはアプリの内容の表示はできるものの、windowsのような管理者実行はできません。ターミナルでコマンド打つしかないです。私の環境では、隠されている実行ファイルは、以下の場所にありました。
VS Codeのバージョン: 1.87.0 (Universal)です。
sudo /Applications/Visual\ Studio\ Code.app/Contents/MacOS/Electron
hotkey使うコード
ctrl+cのような処理に対応できるようです。
以下の例では、関数を登録して、enterかshiftを押して呼び出すプログラムです。
が、escapeは使えませんでした。^[
と出ます。
import keyboard
def hoge1():
print("ok1")
def hoge2():
print("ok2")
keyboard.add_hotkey('enter',hoge1)
keyboard.add_hotkey('shift',hoge2)
keyboard.wait()
参考
sudoで回避
本投稿と同じような状況の投稿
ゲームライブラリPySDL2も試しているようだ。