非root用户使用pyenv下keyboard库add_hotkey报错的解决方法
解决Ubuntu下pyenv管理的Python调用keyboard库需root权限的问题
以下是无需以root身份重新安装pyenv的可行绕过方案:
方案1:给pyenv的Python二进制文件添加权限
keyboard库需要访问系统输入设备,通过给指定Python版本的可执行文件添加特定cap权限,可替代root身份:
- 先定位pyenv下Python 3.12.5的二进制路径,通常为
~/.pyenv/versions/3.12.5/bin/python3.12 - 执行命令:
该命令赋予Python进程管理网络和访问原始套接字的权限,满足keyboard库的底层需求。sudo setcap cap_net_admin,cap_net_raw+ep ~/.pyenv/versions/3.12.5/bin/python3.12
方案2:将当前用户加入input用户组
系统输入设备(/dev/input/下的文件)默认属于input用户组,将用户加入该组后即可读取这些设备:
- 执行命令:
sudo usermod -aG input $USER - 注意:执行完成后必须注销并重新登录,权限变更才会生效,之后运行脚本无需root。
方案3:替换为evdev库(无root依赖)
如果业务需求允许,可改用更底层的evdev库实现热键监听,该库仅要求用户在input组(方案2已解决),无需额外root权限:
- 安装evdev:
pip install evdev - 示例热键监听代码(以Ctrl+Alt+A为例):
from evdev import InputDevice, categorize, ecodes # 先通过`ls /dev/input/by-id/`找到你的键盘设备路径,替换下面的eventX keyboard = InputDevice('/dev/input/eventX') for event in keyboard.read_loop(): if event.type == ecodes.EV_KEY: key_info = categorize(event) # 检测按键按下状态 if key_info.keystate == key_info.key_down and key_info.scancode == ecodes.KEY_A: # 检查是否同时按下Ctrl和Alt active_modifiers = keyboard.active_keys() if ecodes.KEY_LEFTCTRL in active_modifiers and ecodes.KEY_LEFTALT in active_modifiers: print("热键触发,执行操作") # 在这里添加你的业务逻辑
内容的提问来源于stack exchange,提问作者Peeta
相关产品推荐
相关产品推荐

