杰瑞科技汇

Linux下Python如何模拟键盘输入?

核心思路

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

Linux下Python如何模拟键盘输入?-图1
(图片来源网络,侵删)

使用 pynput 库(推荐,跨平台,易用)

pynput 是一个非常流行的库,它提供了一个高级的 API 来控制和监控输入设备,它支持 Linux、Windows 和 macOS,是跨平台应用的首选。

优点:

  • API 简洁:代码非常容易理解和编写。
  • 功能强大:不仅可以模拟键盘,还可以模拟鼠标和监听输入事件。
  • 跨平台:一套代码可以在多个操作系统上运行。

缺点:

  • 依赖于 X11 环境,在某些容器或无头环境中可能需要额外配置。

安装

pip install pynput

使用示例

模拟按键

Linux下Python如何模拟键盘输入?-图2
(图片来源网络,侵删)
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如何模拟键盘输入?-图3
(图片来源网络,侵删)
  • 非常稳定和可靠:在绝大多数桌面 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-tkscrotimagemagick
  • 性能较低:图像识别是 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 是一个不会出错的选择。

分享:
扫描分享到社交APP
上一篇
下一篇