Имитация события нажатия клавиши с использованием Python для Linux

Я пишу скрипт для автоматизации запуска конкретной модели. Когда модель терпит неудачу, она ждет пользовательского ввода (клавиша Enter). Я могу определить, когда модель потерпела неудачу, но я не могу использовать python (в linux) для имитации события нажатия клавиши. В Windows есть библиотека SendKeys, но мне было интересно, есть ли подобная библиотека для python в linux.

Спасибо!

5 ответов

Решение

Если "модель" работает графически (с системой X Window), то уже предложенный xsendkey - это возможность, или xsendkeycode. Если он работает текстуально (в окне терминала), тогда pexpect.

Взгляните на этот https://github.com/SavinaRoja/PyUserInput Введите кроссплатформенное управление мышью и клавиатурой в python.

Управление с клавиатуры работает в системах X11(linux) и Windows. Но нет поддержки Mac (когда я написал этот ответ).

from pykeyboard import PyKeyboard
k = PyKeyboard()

# To Create an Alt+Tab combo
k.press_key(k.alt_key)
k.tap_key(k.tab_key)
k.release_key(k.alt_key)

Более низкоуровневый подход будет заключаться в создании uinput устройство, с которого вы затем вводите входные события в подсистему ввода linux. Рассмотрим следующие библиотеки:

Пример отправки <enter> с последним:

from evdev import uinput, ecodes as e

with uinput.UInput() as ui:
     ui.write(e.EV_KEY, e.KEY_ENTER, 1)
     ui.write(e.EV_KEY, e.KEY_ENTER, 0)
     ui.syn()

Я рекомендую PyAutoGui. Смехотворно прост в использовании, он кроссплатформенный и предназначен для Python 3 и 2.

На связанной странице перечислены зависимости и некоторые примеры кода.

Поскольку многие решения, которые я нашел в этом и в другом хорошо ранжированном SO-ответе, были либо устаревшими ( PyUserInput), либо с использованием evdev, что не удалось (UInputError: "/dev/uinput" cannot be opened for writing) самым простым решением для меня, использующего Linux, был pynput. Один пример прямо из их документов:

from pynput.keyboard import Key, Controller

keyboard = Controller()

# Press and release space
keyboard.press(Key.space)
keyboard.release(Key.space)

# Type a lower case A; this will work even if no key on the
# physical keyboard is labelled 'A'
keyboard.press('a')
keyboard.release('a')

# Type two upper case As
keyboard.press('A')
keyboard.release('A')
with keyboard.pressed(Key.shift):
    keyboard.press('a')
    keyboard.release('a')

# Type 'Hello World' using the shortcut type method
keyboard.type('Hello World')

Оно работало завораживающе!

Другие вопросы по тегам