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

Linux运行keyboard/pyautogui报root权限及Display连接错误

问题根因

两个报错分别对应两个独立的权限问题,没有关联:

  • Spyder中运行抛出ImportError: You must be root to use this library on linux:Linux下keyboard库需要直接读取/dev/input路径下的输入设备节点,普通用户默认没有该路径下设备的读取权限,非root身份运行就会触发这个报错。
  • sudo运行时抛出Xlib.error.DisplayConnectionError: Can't connect to display ":0":sudo提权后运行身份切换为root,而Linux桌面默认使用的X11显示服务有访问控制,root默认没有当前普通用户桌面会话的连接授权,因此依赖X11接口实现鼠标控制的pyautogui无法连接到显示服务,和配置文件读取无关,是X11的访问拦截导致。
解决方法

二选一即可,推荐第二种,一劳永逸不用反复处理权限问题。

方案1:临时授权root访问X会话(适合快速测试)

在普通用户状态下打开终端,先执行命令给root开放当前桌面会话的访问权限:

xhost +SI:localuser:root

执行完成后再通过sudo运行脚本即可正常启动:

sudo python3 Mouse_simulator.py

注意:该授权仅对当前开机会话有效,系统重启后会自动失效,下次运行需要重新执行xhost命令。

方案2:配置普通用户输入权限(推荐)

直接给当前普通用户配置输入设备的读取权限,全程不需要sudo运行脚本,从根源避开X11连接问题:

  1. 将当前登录用户加入input用户组:
    sudo usermod -aG input $USER
    
  2. 配置udev规则永久开放输入设备的组读权限,新建规则文件:
    sudo nano /etc/udev/rules.d/99-input-access.rules
    
    在文件中写入以下配置:
    KERNEL=="event*", SUBSYSTEM=="input", MODE="0640", GROUP="input"
    
    保存退出后执行以下命令重载规则立即生效:
    sudo udevadm control --reload-rules && sudo udevadm trigger
    
  3. 注销当前用户重新登录,之后直接在Spyder或普通终端运行脚本即可,不会再触发两类权限报错。
补充说明

你提供的螺旋绘制脚本逻辑正常,建议取消开头time.sleep(5)的注释,预留5秒时间切换到需要绘图的目标窗口,避免脚本启动后直接在编辑器窗口内执行拖动操作。
对应调整后的参考代码:

import pyautogui
import time
from keyboard import is_pressed as press

distance = 200
time.sleep(5)

while distance > 0:
    """draw a spiral rectangle"""
    
    if press("q"):
        # 按下q键终止程序
        break
    
    pyautogui.drag(distance, 0, duration=0.5)   # 右移
    distance -= 5
    pyautogui.drag(0, distance, duration=0.5)   # 下移
    pyautogui.drag(-distance, 0, duration=0.5)  # 左移
    distance -= 5
    pyautogui.drag(0, -distance, duration=0.5)  # 上移

内容的提问来源于stack exchange,提问作者GameWzZ2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:36:42