How can I simulate a keystroke in python? I also want to press multiple keys simultaneously.
Something like:
keystroke('CTRL+F4')
or
keystroke('Shift+A')
How can I simulate a keystroke in python? I also want to press multiple keys simultaneously.
Something like:
keystroke('CTRL+F4')
or
keystroke('Shift+A')
Although it's specific to X, you can install the xautomation package (apt-get install xautomation
on Debian-based systems) and use xte
to simulate keypresses, e.g.:
from subprocess import Popen, PIPE
control_f4_sequence = '''keydown Control_L
key F4
keyup Control_L
'''
shift_a_sequence = '''keydown Shift_L
key A
keyup Shift_L
'''
def keypress(sequence):
p = Popen(['xte'], stdin=PIPE)
p.communicate(input=sequence)
keypress(shift_a_sequence)
keypress(control_f4_sequence)
Consider python-uinput and evdev. Example of shift+a
with the latter:
from evdev import uinput, ecodes as e
with uinput.UInput() as ui:
ui.write(e.EV_KEY, e.KEY_LEFTSHIFT, 1)
ui.write(e.EV_KEY, e.KEY_A, 1)
ui.syn()
ui.write(ecodes.EV_KEY, ecodes.KEY_DOWN, 1) #key down
ui.write(ecodes.EV_KEY, ecodes.KEY_DOWN, 0) #key up
ui.syn()
–
Prior UInputError: "/dev/uinput" cannot be opened for writing
Any suggestion? –
Schopenhauerism KERNEL=="uinput", MODE="0666
to the top of /etc/udev/rules.d/50-rogdrv.rules and reloading rules solves the problem" (github issue) You can reload udev rules like this # udevadm control --reload-rules && udevadm trigger
(source) –
Cornerstone pip install evdev
, I pasted the example into a python3 interpreter. It worked straight away. It may have helped that I already had the uinput kernel module loaded.- modprobe uinput
. –
Yoshikoyoshio Pythonic API to Linux uinput kernel module...
Python-uinput is Python interface to Linux uinput kernel module which allows attaching userspace device drivers into kernel. In practice, Python-uinput makes it dead simple to create virtual joysticks, keyboards and mice for generating arbitrary input events programmatically...
Although it's specific to X, you can install the xautomation package (apt-get install xautomation
on Debian-based systems) and use xte
to simulate keypresses, e.g.:
from subprocess import Popen, PIPE
control_f4_sequence = '''keydown Control_L
key F4
keyup Control_L
'''
shift_a_sequence = '''keydown Shift_L
key A
keyup Shift_L
'''
def keypress(sequence):
p = Popen(['xte'], stdin=PIPE)
p.communicate(input=sequence)
keypress(shift_a_sequence)
keypress(control_f4_sequence)
If you plan to use it on Linux, try pyautogui library. For multiple keys you will need to use hotkey, e.g.:
pyautogui.hotkey('ctrl', 'c') # ctrl-c to copy
For me it worked - see here: How to pass a keystroke (ALT+TAB) using Popen.communicate (on Linux)?
If you are on Windows, use Sendkeys and if on Linux, try out the suggestion given here for xsendkeys or pexpect.
Simplest solution I have found was using pynput. You could do the following:
from pynput.keyboard import Key, Controller
keyboard = Controller()
with keyboard.pressed(Key.ctrl):
keyboard.press(Key.f4)
keyboard.release(Key.f4)
© 2022 - 2024 — McMap. All rights reserved.