Ubuntu 24下Pynput在终端聚焦时无法识别按键输入的问题求助
问题:Pynput键盘监听在Ubuntu终端聚焦时无法识别输入
环境:
- Ubuntu 24.04
- Python 3.12
- Pynput库
编写的脚本用于监听上箭头按键以终止程序,在PyCharm中运行正常,但在终端窗口聚焦时无法识别按键输入,仅当终端失焦时才能响应。
最初代码:
from pynput.keyboard import Key, Listener stop = False def on_press(key): print(key) if key == Key.up: global stop stop = True if __name__ == "__main__": listener = Listener(on_press=on_press) listener.start() while not stop: pass # some other code goes here
尝试改用with语句+join()后问题依旧:
from pynput.keyboard import Key, Listener stop = False def on_press(key): print(key) if key == Key.up: global stop stop = True if __name__ == "__main__": with Listener(on_press=on_press) as listener: listener.join()
解决方案
1. 替换忙循环为非阻塞等待(推荐)
原代码中的while not stop: pass是忙等待,会持续占用100% CPU,导致pynput的监听线程无法获得足够时间处理键盘事件——尤其终端聚焦时,终端进程也在竞争CPU,进一步阻塞监听线程。
改用threading.Event实现线程安全的非阻塞等待:
from pynput.keyboard import Key, Listener from threading import Event stop_event = Event() def on_press(key): print(key) if key == Key.up: stop_event.set() if __name__ == "__main__": with Listener(on_press=on_press) as listener: stop_event.wait() # 等待事件触发,不占用CPU资源
2. 给忙循环添加短暂休眠
如果需要保留原有循环逻辑,可在循环中加入sleep让出CPU时间,让监听线程有机会处理事件:
from pynput.keyboard import Key, Listener import time stop = False def on_press(key): print(key) if key == Key.up: global stop stop = True if __name__ == "__main__": listener = Listener(on_press=on_press) listener.start() while not stop: time.sleep(0.1) # 让出CPU给监听线程 # 你的其他业务代码 listener.stop()
3. 检查Linux环境依赖
确保pynput能正常访问X11服务,安装必要依赖:
sudo apt install python3-xlib
内容的提问来源于stack exchange,提问作者mm4096
相关产品推荐
相关产品推荐

