使用 Python for Linux 模拟按键事件
Posted
技术标签:
【中文标题】使用 Python for Linux 模拟按键事件【英文标题】:Simulating Key Press event using Python for Linux 【发布时间】:2011-02-04 06:06:41 【问题描述】:我正在编写一个脚本来自动运行特定模型。当模型失败时,它会等待用户输入(Enter 键)。我可以检测到模型何时失败,但我无法使用 python(在 linux 上)来模拟按键事件。 Windows 有 SendKeys 库可以做到这一点,但我想知道在 linux 上是否有类似的 python 库。
谢谢!
【问题讨论】:
【参考方案1】:看看这个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)
【讨论】:
你知道如何“敲击”空格键吗? 看看这些projs,空格键必须映射到' '(里面有空格的字符串)github.com/Narengowda/web-mouse/blob/master/web_mouse/…github.com/SavinaRoja/PyUserInput/blob/master/pykeyboard/… 我想出了类似k.tab_key(k.keypad_keys['Space'])
的东西,但它不起作用。我很难理解项目文档。你能帮忙吗?
你试过 key_board.type_string(' ') 吗?【参考方案2】:
更底层的方法是创建一个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()
【讨论】:
【参考方案3】:如果“模型”以图形方式运行(使用 X 窗口系统),则可以使用已建议的 xsendkey 或 xsendkeycode。如果它以文本方式运行(在终端窗口中),则为pexpect。
【讨论】:
嗨!推论:使用 pexpect 时,以下简单程序似乎对我不起作用: import pexpect child = pexpect.spawn('ls') fout = file('output.txt', 'w') child.logfile = fout 即, output.txt 已创建,但当我 cat 它时为空。 pexpect 安装得很好,因为我可以运行程序附带的示例。任何建议,将不胜感激!谢谢!xsendkey
和 xsendkeycode
的链接已失效。
@hazzey 这是一个非常棒的分支:github.com/kyoto/sendkeys xsendkey 程序非常棒,可以在不允许简单的复制粘贴以及必须编写标签后使用验证时绕过限制输入/返回键,就像在 Tumblr 上一样(javascript hack 会更复杂)【参考方案4】:
我推荐PyAutoGui。它使用起来非常简单,它是跨平台的,并且适用于 Python 3 和 2。
在链接页面中列出了依赖关系和一些代码示例。
【讨论】:
【参考方案5】:http://people.csail.mit.edu/adonovan/hacks/xsendkey.html
【讨论】:
你显然可以看一下xsendkey这个相当简单的代码,然后在python的Xlib绑定中搜索对应的调用。【参考方案6】:由于我在这个和另一个well ranked SO response 中找到的许多解决方案要么被弃用(PyUserInput),要么使用evdev,但失败了(UInputError: "/dev/uinput" cannot be opened for writing
)对我来说使用Linux 最简单的解决方案是@987654324 @。直接来自他们的文档的一个示例:
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')
它就像一个魅力!
【讨论】:
以上是关于使用 Python for Linux 模拟按键事件的主要内容,如果未能解决你的问题,请参考以下文章