在Linux系统下使用Python禁用键盘的实现方案问询
嘿,我完全理解你的需求——手部有健康问题,需要在打字超限时强制禁用键盘,之前Windows的方案在Linux上不管用对吧?我给你几个在Linux下能用的Python实现方法,分不同场景给你讲:
方案1:用evdev库(底层控制,支持X11和Wayland)
这个方法直接和Linux的输入设备交互,不管你用X11还是Wayland桌面都能生效,不过需要root权限(因为要访问/dev/input下的设备文件)。
步骤:
- 先安装evdev库:
pip install evdev
- 找到你的键盘设备路径:
运行ls /dev/input/by-id/,找名字里带kbd或者keyboard的设备,比如usb-Logitech_USB_Keyboard-event-kbd,把这个路径记下来。 - 编写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工具。
步骤:
- 确保系统安装了xinput(大部分X11桌面默认都有),如果没有的话用包管理器安装,比如Debian/Ubuntu:
sudo apt install xinput
- 编写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
相关产品推荐
相关产品推荐

