Сообщить об ошибке.

Модуль pynput в Python, управление клавиатурой и мышью

Перехват и имитация событий клавиатуры и мыши из Python

Модуль pynput позволяет перехватывать и имитировать события устройств ввода, а именно клавиатуры и мыши. Модуль включает в себя подмодули для каждого типа поддерживаемого устройства ввода:

  • pynput.keyboard - содержит классы для управления и мониторинга клавиатуры.
  • pynput.mouse - содержит классы для управления и мониторинга мыши или trackpad.

Все упомянутые выше модули автоматически импортируются в пакет pynput. Чтобы использовать их, необходимо импортировать каждый из основного пакета:

from pynput import mouse, keyboard

Установка модуля pynput в виртуальное окружение.

Модуль pynput размещен на PyPI, поэтому установка относительно проста.

# создаем виртуальное окружение, если нет
$ python3 -m venv .venv --prompt VirtualEnv
# активируем виртуальное окружение 
$ source .venv/bin/activate
# ставим модуль pynput
(VirtualEnv):~$ python3 -m pip install -U pynput

Модуль pynput будет пытаться использовать определенный внутренний интерфейс, подходящий для текущей платформы, но этот автоматический выбор можно переопределить.

Если заданы переменные окружения $PYNPUT_BACKEND_KEYBOARD или $PYNPUT_BACKEND, то их значение будет использоваться в качестве имени сервера для классов клавиатуры, а если заданы $PYNPUT_BACKEND_MOUSE или $PYNPUT_BACKEND, то их значение будет использоваться в качестве имени сервера для классов мыши.

Доступные серверные части являются:

  • darwin - значение по умолчанию для macOS.
  • win32 - значение по умолчанию для Windows.
  • xorg - значение по умолчанию для других операционных систем.
  • uinput - дополнительный серверный интерфейс для Linux, требующий привилегий root и поддерживающий только клавиатуры.
  • dummy - нефункциональный, но импортируемый серверный интерфейс. Он полезен в качестве серверной части мыши при использовании серверной части uinput.

Ограничения платформ.

Модуль pynput направлен на предоставление единого API для всех поддерживаемых платформ, но в некоторых случаях это не совсем возможно.

Ограничения платформы Linux.

В Linux, модуль pynput использует X-сервер или библиотеку uinput (требует root привилегий). При работе под X-сервером должно выполняться следующее:

  • X-сервер должен быть запущен.
  • Должна быть установлена ​​переменная окружения $DISPLAY.
  • При работе под uinput должно быть верно следующее:

    Необходимо запускать программу Python с root правами, чтобы она имела необходимые разрешения для работы с uinput.

    Первое требование для X-сервера означает, что запуск pynput через SSH обычно не работает. Чтобы обойти это, обязательно установите переменную окружения $DISPLAY:

    $ DISPLAY=:0 python -c 'import pynput'
    

    Обратите внимание, что значение DISPLAY=:0 является лишь примером. Чтобы узнать фактическое значение, запустите терминальное приложение из среды рабочего стола и введите команду: echo $DISPLAY.

При работе под Wayland эмулятор X-сервера Xwayland обычно работает, предоставляя ограниченную функциональность. При этом, модуль pynput будет получать входные события только от приложений, работающих под управлением этого эмулятора.

Ограничения платформы macOS.

Последние версии macOS ограничивают мониторинг клавиатуры из соображений безопасности. По этой причине одно из следующего должно быть истинным:

  • Процесс должен запускаться от имени root.
  • Приложение должно быть внесено в белый список в разделе "Разрешить доступ для вспомогательных устройств". Обратите внимание, что для этого может потребоваться упаковка приложения, т.к. в противном случае, вся установка Python должна быть включена в белый список.
  • В версиях после Mojave, если скрипт запускается из терминала, то может потребоваться добавить в белый список также приложение терминала.

Обратите внимание, что это требование не относится к мониторингу мыши или trackpad.

Если нет недостающих разрешений, то все классы слушателей Listener имеют дополнительный атрибут IS_TRUSTED, который имеет значение True.

Ограничения платформы Windows.

В Windows, виртуальные события, отправленные другими процессами, могут не приниматься. Чтобы отправлять любые сгенерированные виртуальные события всем запущенным слушателям текущего процесса, модуль pynput принимает меры предосторожности.

Кроме того, отправка событий нажатия клавиш будет правильно распространяться на остальную часть системы, но сама операционная система не будет считать, что кнопки действительно нажаты. Это означает, что события нажатия клавиши, созданные модулем, не будут генерироваться постоянно, как при физическом удерживании клавиши, а определенные последовательности клавиш, такие как нажатие Shift при нажатии клавиш со стрелками, не будут работать должным образом.

Пример использования модуля pynput.

Мониторинг клавиатуры.

Подмодуль pynput.keyboard содержит классы для управления и мониторинга клавиатуры.

from pynput import keyboard

# В этом блоке будет работать слушатель событий.
with keyboard.Events() as events:
    for event in events:
        if event.key == keyboard.Key.esc:
            break
        else:
            print(f'Получено событие клавиатуры {event}')

Управление мышью.

Подмодуль pynput.mouse содержит классы для управления и мониторинга мыши.

from pynput.mouse import Button, Controller

mouse = Controller()

# Считывание положения указателя
print(f'Текущее положение указателя: {mouse.position}')

# Установка положения указателя
mouse.position = (10, 20)
print(f'Указатель перемещен в позицию: {mouse.position}')

# Перемещение указателя относительно текущего положения
mouse.move(5, -5)

# Нажатие и отпускание левой кнопки мыши
mouse.press(Button.left)
mouse.release(Button.left)

# Двойной клик - отличается от простого нажатия
mouse.click(Button.left, 2)

# Прокрутка страницы на два шага вниз
mouse.scroll(0, 2)