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グループでアクセスできる前提っぽい。それじゃあ動かねえんだよなあ。一応無駄ではなかったような気がするので良しとする。
0 件のコメント:
コメントを投稿