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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 01:50:07