1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonのキーボード入力でMac環境でおきるトラブル

Posted at

概要

 Mac環境でKeyboardライブラリが使いにくいという話です。回避策はあるものの、やや使いにくいです。

キーボード入力

Pythonでキーボード入力をしようとする場合、2つの手法が見つかる。
①input関数を使う
②keyboardライブラリを使う

①は2文字以上の文字とか数字を扱う。エンターキーで確定するまで、入力を受け付ける。②はデバイスとしてのキーボードを扱う。

この投稿では②を扱う。

keyboardライブラリのインストール

ターミナルからコマンドでインストールする。

pip install keyboard
pip show keyboard
Version: 0.13.5

プログラム例

よくあるコードは、こんな感じです。
また、保存するファイル名をkeyboard.pyにすると、エラーになります。
注意しなければ。

python
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は使えませんでした。^[と出ます。

python
import keyboard

def hoge1():
    print("ok1")
def hoge2():
    print("ok2")

keyboard.add_hotkey('enter',hoge1)
keyboard.add_hotkey('shift',hoge2)
keyboard.wait()

参考

sudoで回避

本投稿と同じような状況の投稿
ゲームライブラリPySDL2も試しているようだ。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?