You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非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
  • 执行命令:
    sudo setcap cap_net_admin,cap_net_raw+ep ~/.pyenv/versions/3.12.5/bin/python3.12
    
    该命令赋予Python进程管理网络和访问原始套接字的权限,满足keyboard库的底层需求。

方案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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:57:09