Fedora 38(Wayland)环境下Pynput无法运行的问题求助
Pynput在Wayland环境下的授权错误解决方法
问题场景
在Fedora Linux 38(GNOME 44.3,Wayland)环境下运行以下Pynput测试脚本时,出现X连接授权失败错误:
from pynput import keyboard def on_key_press(key): try: print(f'Key pressed: {key.char}') except AttributeError: print(f'Special key pressed: {key}') def on_key_release(key): pass with keyboard.Listener(on_press=on_key_press, on_release=on_key_release) as listener: listener.join()
错误信息
Traceback (most recent call last): File "/home/voldemort/projects/pynput_tutorial/main.py", line 1, in <module> from pynput import keyboard File "/home/voldemort/projects/pynput_tutorial/venv/lib/python3.11/site-packages/pynput/__init__.py", line 40, in <module> from . import keyboard File "/home/voldemort/projects/pynput_tutorial/venv/lib/python3.11/site-packages/pynput/keyboard/__init__.py", line 31, in <module> backend = backend(__name__) ^^^^^^^^^^^^^^^^^ File "/home/voldemort/projects/pynput_tutorial/venv/lib/python3.11/site-packages/pynput/_util/__init__.py", line 76, in backend raise ImportError('this platform is not supported: {}'.format( ImportError: this platform is not supported: ('failed to acquire X connection: Can\'t connect to display ":0": b\'Authorization required, but no authorization protocol specified\\n\'', DisplayConnectionError(':0', b'Authorization required, but no authorization protocol specified\n')) Try one of the following resolutions: * Please make sure that you have an X server running, and that the DISPLAY environment variable is set correctly
解决方法
错误根源是Pynput默认依赖X11后端,而当前使用Wayland会话,可通过以下三种方式解决:
方法1:临时切换到Xorg会话
- 登录GNOME时,点击用户名旁的齿轮图标,选择「GNOME on Xorg」登录,之后直接运行脚本即可正常工作。
方法2:为Wayland配置X授权(无需切换会话)
- 获取当前用户的X授权信息:
输出示例:xauth list $DISPLAYlocalhost:10 MIT-MAGIC-COOKIE-1 abcdef1234567890 - 将授权信息添加到当前终端环境:
示例:xauth add <上述输出的完整内容>xauth add localhost:10 MIT-MAGIC-COOKIE-1 abcdef1234567890 - 确认DISPLAY变量设置:
若输出为空,手动设置:echo $DISPLAYexport DISPLAY=:0 - 再次运行Python脚本即可。
方法3:使用Wayland后端(需Pynput版本支持)
部分新版本Pynput已添加Wayland支持,先升级Pynput:
pip install --upgrade pynput
升级后若仍报错,手动指定Wayland后端:
import os os.environ['PYNPUT_BACKEND'] = 'wayland' from pynput import keyboard # 后续脚本代码保持不变 def on_key_press(key): try: print(f'Key pressed: {key.char}') except AttributeError: print(f'Special key pressed: {key}') def on_key_release(key): pass with keyboard.Listener(on_press=on_key_press, on_release=on_key_release) as listener: listener.join()
注意:Wayland后端功能可能不如X11完善,部分按键监听场景可能受限。
内容的提问来源于stack exchange,提问作者BasicLucifer
相关产品推荐
相关产品推荐

