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

在Linux系统下使用Python禁用键盘的实现方案问询

嘿,我完全理解你的需求——手部有健康问题,需要在打字超限时强制禁用键盘,之前Windows的方案在Linux上不管用对吧?我给你几个在Linux下能用的Python实现方法,分不同场景给你讲:

方案1:用evdev库(底层控制,支持X11和Wayland)

这个方法直接和Linux的输入设备交互,不管你用X11还是Wayland桌面都能生效,不过需要root权限(因为要访问/dev/input下的设备文件)。

步骤:

  1. 先安装evdev库:
pip install evdev
  1. 找到你的键盘设备路径:
    运行ls /dev/input/by-id/,找名字里带kbd或者keyboard的设备,比如usb-Logitech_USB_Keyboard-event-kbd,把这个路径记下来。
  2. 编写Python代码:
from evdev import InputDevice
import signal
import sys

# 替换成你的键盘设备路径
KEYBOARD_PATH = "/dev/input/by-id/usb-Logitech_USB_Keyboard-event-kbd"

def restore_keyboard(signal, frame):
    kb.ungrab()
    print("\n键盘已恢复正常,再见!")
    sys.exit(0)

# 监听Ctrl+C信号,用于恢复键盘
signal.signal(signal.SIGINT, restore_keyboard)

try:
    kb = InputDevice(KEYBOARD_PATH)
    print(f"已识别键盘: {kb.name}")
    
    # 抓取设备,此时系统其他程序无法接收该键盘的输入
    kb.grab()
    print("键盘已禁用!按Ctrl+C恢复输入")
    
    # 保持程序运行,不然抓取会失效
    for _ in kb.read_loop():
        pass

except Exception as e:
    print(f"出错了: {str(e)}")
    print("提示:请确保用root权限运行此程序,且设备路径正确")

说明:

  • 必须用sudo python your_script.py运行,否则没有权限访问输入设备
  • 如果有多个键盘,你可以遍历所有键盘设备并逐个抓取(用list_devices()方法获取所有设备路径,然后筛选键盘)
  • 这个方法非常可靠,因为是直接从系统底层拦截输入

方案2:用xinput调用系统命令(X11桌面友好)

如果你用的是X11桌面环境(比如GNOME Xorg、KDE Xorg、Xfce等),这个方法更简单,不需要额外安装Python库,只要调用系统自带的xinput工具。

步骤:

  1. 确保系统安装了xinput(大部分X11桌面默认都有),如果没有的话用包管理器安装,比如Debian/Ubuntu:
sudo apt install xinput
  1. 编写Python代码:
import subprocess
import re
import signal
import sys

def get_keyboard_ids():
    # 从xinput输出中提取所有键盘设备的ID
    output = subprocess.run(["xinput", "list"], capture_output=True, text=True).stdout
    keyboard_ids = []
    for line in output.splitlines():
        # 匹配包含键盘关键词的行
        if "keyboard" in line.lower() or "kbd" in line.lower():
            match = re.search(r'id=(\d+)', line)
            if match:
                keyboard_ids.append(match.group(1))
    return keyboard_ids

def disable_keyboards():
    ids = get_keyboard_ids()
    for id in ids:
        subprocess.run(["xinput", "disable", id], check=True)
        print(f"已禁用键盘设备ID: {id}")

def enable_keyboards():
    ids = get_keyboard_ids()
    for id in ids:
        subprocess.run(["xinput", "enable", id], check=True)
        print(f"已恢复键盘设备ID: {id}")

def handle_exit(signal, frame):
    enable_keyboards()
    print("\n键盘已恢复,程序退出")
    sys.exit(0)

# 监听退出信号,确保恢复键盘
signal.signal(signal.SIGINT, handle_exit)
signal.signal(signal.SIGTERM, handle_exit)

if __name__ == "__main__":
    try:
        disable_keyboards()
        print("键盘已禁用!按Ctrl+C恢复,或者关闭程序恢复")
        # 保持程序运行
        input()
    except subprocess.CalledProcessError as e:
        print(f"执行命令出错: {str(e)}")
    except Exception as e:
        print(f"程序出错: {str(e)}")
        enable_keyboards()

说明:

  • 这个方法不需要root权限(除非你的系统权限限制严格)
  • 只适用于X11桌面,Wayland环境下xinput不生效
  • 会自动识别所有键盘设备,不用手动找路径

重要提醒

不管用哪个方法,都建议加上自动恢复机制,比如定时一段时间后自动解锁键盘,避免你不小心完全锁死自己(示例代码:

from threading import Timer

# 5分钟后自动恢复键盘
Timer(300, enable_keyboards).start()

把这段代码加到禁用键盘之后,这样即使你忘了手动恢复,5分钟后也能正常输入)。

内容的提问来源于stack exchange,提问作者TT-392

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 08:47:38