Имитация события нажатия клавиши с использованием 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')
Оно работало завораживающе!