2026年6月3日水曜日

pythonのkeyboardモジュールがroot権限を要求してきて困る

windowsのpythonでkeyboardモジュールを使って作ったプログラムがある。

キー入力「ctr l+g」とかで何かを実行する みたいな処理をするのに使っていたが、最近はほぼlinuxをメインで使ってるのでlinuxで動かしたい。

が、linuxでpythonのkeyboardを使うとroot権限が必要と言われて動かない。それでは困るのだ。

なんでも良いから動けばいいので、とりあえず以下のように回避した。

回避方法

とりあえずvenv環境でpythonを動かしてkeyboardを入れる。 (keyboard version 0.13.5)

python -m venv venv
. venv/bin/activate
pip install keyboard 

このvenvの中のkeyboardをいじって動くようにする。まずは以下の部分でrootを要求しているので、無効にする。

venv/lib/python3.13/site-packages/keyboard/_nixcommon.py

def ensure_root():
    if os.geteuid() != 0:
-        raise ImportError('You must be root to use this library on linux.')
+       pass

次は/dev/input/event*へのアクセスができれば良い。見たところinputグループに入っていればアクセスできる。

usermod -aG input ユーザ名

これでも以下でエラーが出る。

File "/usr/lib/python3.13/subprocess.py", line 577, in run
    raise CalledProcessError(retcode, process.args,
                             output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['dumpkeys', '--keys-only']' returned non-zero exit status 1.

「dumpkeys --keys-only」を使っているようだが、rootじゃないとエラーになる。ディストリによるのかもしれないが、こっちはグループでどうにかなるものじゃなさそう。/dev/consoleをa+rwにしてもいいとは思うが、なんか怖いので以下のようにした。

一旦sudoで動かして結果を取っておく。

sudo dumpkeys --keys-only > keys

そして、dumpkeysで取得すべき出力をcatで代替する。

    synonyms_template = r'^(\S+)\s+for (.+)$'
-    dump = check_output(['dumpkeys', '--keys-only'], universal_newlines=True)
+    dump = check_output(['cat', 'keys'], universal_newlines=True)
    for synonym_str, original_str in re.findall(synonyms_template, dump, re.MULTILINE):

問題なく動いた。 

その後 

ふと公式を見ると、masterブランチでは解決されているっぽい?また車輪の再発明をしてしまったのか?

https://github.com/boppreh/keyboard/commit/7f03a3d567b484ae6c2beebe2fe537be7643f7a9 

よく見ると/dev/consoleがttyグループでアクセスできる前提っぽい。それじゃあ動かねえんだよなあ。一応無駄ではなかったような気がするので良しとする。