核心思路
在 Linux 中,键盘输入通常是通过 X Window System 的核心协议来处理的,要模拟键盘输入,我们的 Python 程序需要能够与 X Server 通信。

(图片来源网络,侵删)
使用 pynput 库(推荐,跨平台,易用)
pynput 是一个非常流行的库,它提供了一个高级的 API 来控制和监控输入设备,它支持 Linux、Windows 和 macOS,是跨平台应用的首选。
优点:
- API 简洁:代码非常容易理解和编写。
- 功能强大:不仅可以模拟键盘,还可以模拟鼠标和监听输入事件。
- 跨平台:一套代码可以在多个操作系统上运行。
缺点:
- 依赖于 X11 环境,在某些容器或无头环境中可能需要额外配置。
安装
pip install pynput
使用示例
模拟按键

(图片来源网络,侵删)
from pynput.keyboard import Controller, Key
# 创建一个键盘控制器
keyboard = Controller()
# 模拟按下一个键
keyboard.press('a')
keyboard.release('a')
# 模拟按下并释放一个组合键,Ctrl+C
keyboard.press(Key.ctrl)
keyboard.press('c')
# 注意释放的顺序
keyboard.release('c')
keyboard.release(Key.ctrl)
# 模拟输入一串文本
keyboard.type("Hello, Linux World!")
# 模拟按下特殊键
keyboard.press(Key.enter)
keyboard.release(Key.enter)
# 模拟按下 Tab 键
keyboard.press(Key.tab)
keyboard.release(Key.tab)
# 模拟按下 Alt+Tab (切换窗口)
# 注意:这个组合键通常由窗口管理器处理,模拟效果可能因环境而异
keyboard.press(Key.alt)
keyboard.press(Key.tab)
keyboard.release(Key.tab)
keyboard.release(Key.alt)
监听与模拟结合
一个更强大的功能是结合监听和模拟,例如创建一个简单的宏:当按下 F1 时,输入 "Hello"。
from pynput import keyboard
import time
# 定义要模拟的文本
macro_text = "Hello from macro!"
def on_activate_f1():
print('F1 按下,开始输入宏...')
keyboard.Controller().type(macro_text)
# 定义要监听的快捷键
hotkey = keyboard.HotKey(
keyboard.HotKey.parse('<ctrl>+<alt>+h'), # Ctrl+Alt+H 触发
on_activate_f1
)
def on_press(key):
try:
hotkey.press(key)
except AttributeError:
pass
def on_release(key):
try:
hotkey.release(key)
except AttributeError:
pass
if key == keyboard.Key.esc:
# 停止监听
return False
# 监听键盘事件
print('正在监听键盘事件... 按 Ctrl+Alt+H 触发宏,按 ESC 退出。')
with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
listener.join()
使用 xdotool(系统工具,强大,依赖 X)
xdotool 是一个命令行工具,用于“模拟”X11 输入,它本身不是 Python 库,但可以通过 Python 的 subprocess 模块来调用。
优点:

(图片来源网络,侵删)
- 非常稳定和可靠:在绝大多数桌面 Linux 发行版上都能完美工作。
- 功能极其丰富:除了键盘,还可以模拟鼠标移动、点击、窗口管理等。
- 无需额外安装 Python 库:只需要系统上安装
xdotool。
缺点:
- 非原生 Python:需要调用外部进程,会有一定的性能开销。
- 处理复杂的组合键或文本输入不如
pynput灵活。
安装
在基于 Debian/Ubuntu 的系统上:
sudo apt-get install xdotool
在基于 Fedora/CentOS 的系统上:
sudo dnf install xdotool
使用示例
通过 Python 的 subprocess 模块来执行 xdotool 命令。
import subprocess import time # 模拟按下单个键 # 命令: xdotool key a subprocess.run(['xdotool', 'key', 'a']) # 模拟按下回车键 # 命令: xdotool key Return subprocess.run(['xdotool', 'key', 'Return']) # 模拟按下组合键 Ctrl+C # 命令: xdotool key ctrl+c subprocess.run(['xdotool', 'key', 'ctrl+c']) # 模拟输入一串文本 # 命令: xdotool type "Hello, Linux World!" subprocess.run(['xdotool', 'type', 'Hello, Linux World!']) # 模拟按下 Alt+Tab 组合键 # 命令: xdotool key alt+tab subprocess.run(['xdotool', 'key', 'alt+tab']) # 模拟按键序列,例如在终端中输入 "ls" 并回车 subprocess.run(['xdotool', 'key', 'l']) subprocess.run(['xdotool', 'key', 's']) subprocess.run(['xdotool', 'key', 'Return']) # 等待一下,再执行下一个动作,模拟人类操作 time.sleep(0.5) subprocess.run(['xdotool', 'type', 'pwd']) time.sleep(0.5) subprocess.run(['xdotool', 'key', 'Return'])
使用 pyautogui(跨平台,基于图像识别)
pyautogui 是另一个非常流行的跨平台 GUI 自动化库,它不仅可以模拟输入,还可以通过截取屏幕图像来定位元素并点击,这对于处理没有标准控件的窗口(如游戏、旧软件)非常有用。
优点:
- 功能全面:结合了键盘、鼠标和屏幕截图/图像识别。
- 跨平台:支持 Linux, Windows, macOS。
- 适合复杂场景:当无法通过窗口标题或类名定位元素时,图像识别是最后的手段。
缺点:
- 依赖 X11 和屏幕截图工具:在 Linux 上需要安装
python3-tk和scrot或imagemagick。 - 性能较低:图像识别是 CPU 密集型操作,速度较慢。
- 可靠性依赖屏幕:如果分辨率、缩放比例或界面发生变化,脚本可能会失败。
安装
pip install pyautogui
安装 Linux 下的依赖:
sudo apt-get install python3-tk scrot # 对于 Ubuntu/Debian # 或者 sudo dnf install python3-tk ImageMagick # 对于 Fedora/CentOS
使用示例
import pyautogui
import time
# 设置一个安全退出机制,将鼠标移动到屏幕左上角可以触发 FailSafeException
pyautogui.FAILSAFE = True
# 模拟按键
pyautogui.press('a') # 按下并释放 'a'
# 模拟组合键
pyautogui.hotkey('ctrl', 'c') # 按下 Ctrl+C
# 模拟输入文本
pyautogui.write('Hello from PyAutoGUI!', interval=0.1) # interval 模拟打字速度
# 模拟按下特殊键
pyautogui.press('enter')
pyautogui.press('tab')
# --- 结合鼠标操作的例子 ---
print("将在 5 秒后开始操作,请将鼠标移动到记事本窗口...")
time.sleep(5)
# 1. 移动鼠标到屏幕中央 (1920, 1080 是屏幕分辨率)
screenWidth, screenHeight = pyautogui.size()
pyautogui.moveTo(screenWidth / 2, screenHeight / 2, duration=1.5)
# 2. 点击鼠标
pyautogui.click()
# 3. 输入文本
pyautogui.write('This is clicked text.')
# 4. 图像识别点击
# 假设你有一个名为 'ok_button.png' 的按钮截图
try:
ok_button_location = pyautogui.locateOnScreen('ok_button.png')
if ok_button_location:
print("找到了 'OK' 按钮!")
# 获取按钮中心点坐标
ok_button_center = pyautogui.center(ok_button_location)
pyautogui.click(ok_button_center)
else:
print("在屏幕上没有找到 'OK' 按钮。")
except pyautogui.ImageNotFoundException:
print("错误:找不到 'ok_button.png' 文件或图像。")
总结与如何选择
| 特性 | pynput |
xdotool |
pyautogui |
|---|---|---|---|
| 类型 | Python 库 | 系统命令 (Python 调用) | Python 库 |
| 易用性 | 高,API 直观 | 中等,需学习命令 | 中等,API 直观 |
| 功能 | 键盘、鼠标监听与模拟 | 键盘、鼠标、窗口管理 | 键盘、鼠标、图像识别 |
| 跨平台 | 是 | 否 (仅 Linux/Unix-like) | 是 |
| 性能 | 较好 | 非常好 (原生调用) | 较慢 (图像识别) |
| 可靠性 | 高 | 极高 | 中等 (依赖屏幕) |
| 最佳场景 | 跨平台应用、需要监听输入、快速开发 | Linux 环境下的脚本、后台自动化、性能要求高 | GUI 自动化、游戏脚本、处理非标准界面 |
选择建议:
- 如果你是初学者,或者你的脚本需要在 Windows 和 Linux 上都能运行:首选
pynput,它的 API 最友好,功能也足够强大。 - 如果你的脚本只在 Linux 上运行,并且追求最高的稳定性和性能:使用
xdotool+subprocess,这是 Linux 系统管理员和自动化专家的利器。 - 如果你的自动化任务需要根据屏幕上的图像来决定下一步操作(例如点击一个没有标题的按钮):必须使用
pyautogui,这是它最独特的优势。
对于绝大多数情况,pynput 是一个不会出错的选择。
