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连接问题:
- 将当前登录用户加入
input用户组:sudo usermod -aG input $USER - 配置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 - 注销当前用户重新登录,之后直接在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
相关产品推荐
相关产品推荐

