使用Python模拟Linux中的按键事件

14

我正在编写一个脚本来自动运行一个特定的模型。当模型失败时,它会等待用户输入 (按 Enter 键)。虽然我能够检测到模型失败,但是我无法使用 Python (在 Linux 上) 来模拟键盘按键事件。Windows 有 SendKeys 库可以做到这一点,但我想知道是否有类似的库可以在 Linux 上使用 Python 实现。

谢谢!

6个回答

15

看看这个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)

你知道如何“轻敲”空格键吗? - user3768495
请查看这些项目,空格键必须映射到包含空格的字符串“ ”。 https://github.com/Narengowda/web-mouse/blob/master/web_mouse/mouse_wsh.py#L62 https://github.com/SavinaRoja/PyUserInput/blob/master/pykeyboard/x11.py#L28 - naren
我想到了类似于 k.tab_key(k.keypad_keys['Space']) 的东西,但它不起作用。我很难理解项目文档。你能帮忙吗? - user3768495
你尝试过 key_board.type_string(' ') 吗? - naren

10

一种更底层的方法是创建一个 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()

7
如果“model”正在图形界面下运行(使用X窗口系统),那么已经建议的xsendkey是一种可能性,或者xsendkeycode。如果它在文本模式下运行(在终端窗口中),则可以使用pexpect

你好!一个推论: 在使用pexpect时,以下简单程序似乎对我无效: import pexpect child = pexpect.spawn('ls') fout = file('output.txt', 'w') child.logfile = fout即,output.txt被创建但是当我查看它时是空的。pexpect已经成功安装,因为我可以运行该程序提供的示例。任何建议将不胜感激! 谢谢! - user308827
9
xsendkey е’Ң xsendkeycode зҡ„й“ҫжҺҘе·Із»ҸеӨұж•ҲгҖӮ - hazzey
@hazzey 这里是一个很好用的分支:https://github.com/kyoto/sendkeys。当不能简单复制粘贴且必须使用回车 / Enter 键写标签并进行验证(例如在Tumblr上),以绕过限制时,xsendkey程序非常棒(JavaScript hack可能更加复杂)。 - baptx

2
我推荐使用PyAutoGui。它非常容易使用,跨平台,适用于Python 3和2。
在链接的页面中列出了依赖项和一些代码示例。

1

1
你可以显然地查看xsendkey的相当简单的代码,并在Python的Xlib绑定中搜索相应的调用。 - baol

0

由于我在这个和另一个 排名靠前的 SO 响应 中找到的许多解决方案都已过时(PyUserInput)或使用了失败的evdevUInputError:无法打开“/dev/uinput”以进行写入),所以对我而言,在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')

它像魔术一样奏效!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接