pynput 是啥?pynput 是一个用 Python 写的跨平台库,专门帮你控制和监听键盘、鼠标。想要让程序像真人一样敲键盘、点鼠标,甚至捕获全局快捷键,pynput 都能搞定。它把系统底层的输入事件包装成 Python 对象,既能主动发送指令(比如自动点击),也能被动监听(比如捕获用户按键),简直是键鼠自动化的瑞士军刀。
它解决了哪些痛点?
| | |
| 各系统分别写 C++/WinAPI/AppleScript | 同一套 API,内部自动切换 backend(win32、darwin、xorg、uinput) |
| | keyboard.GlobalHotKeys |
| 用 Selenium、AutoIt、PyAutoGUI 等,各有局限 | 直接调用 mouse.Controller、keyboard.Controller,代码简洁、实时 |
| | Listener 本身是 threading.Thread,返回 stop()、join(),省心省力 |
安装 & 第一步
pip install pynput
- • Windows、macOS、Linux 都能直接装。
- • Linux 若想用
uinput(只支持键盘)需要 sudo apt-get install python3-uinput 并 以 root 运行。 - • 安装完后,直接
from pynput import mouse, keyboard 就能用了。
快速上手:鼠标
from pynput.mouse import Button, Controllermouse = Controller()# 读取当前坐标print('当前位置:', mouse.position)# 移动到 (100, 200)mouse.position = (100, 200)# 相对移动mouse.move(30, -10)# 左键单击两次mouse.click(Button.left, 2)# 滚轮向下滚两格mouse.scroll(0, 2)
监听鼠标事件(非阻塞):
from pynput import mousedefon_move(x, y):print(f'鼠标移动到 {x},{y}')defon_click(x, y, button, pressed):print(f'{"按下"if pressed else"释放"}{button} at {x},{y}')ifnot pressed: # 松开即停止returnFalselistener = mouse.Listener(on_move=on_move, on_click=on_click)listener.start() # 线程在后台跑
快速上手:键盘
from pynput.keyboard import Key, Controllerkb = Controller()kb.press(Key.space)kb.release(Key.space)kb.type('Hello, pynput!') # 自动敲出整段文字
监听键盘事件(阻塞版):
from pynput import keyboarddefon_press(key):try:print(f'字母键 {key.char} 被按下')except AttributeError:print(f'功能键 {key} 被按下')defon_release(key):print(f'{key} 释放')if key == keyboard.Key.esc: # 按 ESC 退出returnFalsewith keyboard.Listener(on_press=on_press, on_release=on_release) as listener: listener.join()
全局快捷键的酷玩法
from pynput import keyboarddefhello():print('全局快捷键 <Ctrl+Alt+H> 被触发!')with keyboard.GlobalHotKeys({'<ctrl>+<alt>+h': hello,'<ctrl>+<alt>+q': lambda: print('退出')}) as gh: gh.join()
只要程序在跑,这两个组合键随时能被捕获,根本不需要额外的系统注册表操作。
优缺点一览
| |
| ⚠️ Linux 需要 uinput 或 xorg,权限稍高 |
| ⚠️ 回调函数在独立线程执行,长耗时操作要自行分流 |
| |
| ⚠️ 对于 GUI 框架(如 PyQt)需要注意主循环冲突 |
小结pynput 就像一把“隐形键鼠遥控器”,把本来需要系统底层代码才能干的事,压缩成几行 Python。无论是自动化脚本、游戏外挂、键盘宏,还是测试工具,都能轻松上手。记住两点:1️⃣ 监听回调不要阻塞,若有复杂业务,直接 queue 交给主线程或另起线程处理。2️⃣ 跨平台时注意后端(PYNPUT_BACKEND_* 环境变量),有时候手动指定能避开奇怪的兼容性问题。
有了 pynput,键鼠不再是“手动”操作,动动手指就能让电脑听你的。赶紧去试试吧!
项目地址:https://github.com/moses-palmer/pynput