【问题标题】:Simulate keystroke in Linux with Python用 Python 在 Linux 中模拟击键
【发布时间】:2011-08-08 12:22:55
【问题描述】:

如何在 python 中模拟击键?我也想同时按多个键。

类似:

keystroke('CTRL+F4')

keystroke('Shift+A')

【问题讨论】:

  • 请问您为什么要这样做?还有,在什么环境下?命令行?图形桌面?

标签: python linux simulation keystroke


【解决方案1】:

考虑python-uinputevdevshift+a 与后者的示例:

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()

【讨论】:

  • 我尝试了类似的代码,它被执行是因为我在系统日志中看到创建了一个新的虚拟输入设备但按键没有出现在 X 中?有什么特别的事情可以让 X 服务器接收到密钥吗?
  • 链接失效
  • 这太棒了!请注意,1 是 keydown 事件,0 是 keyup,因此如果您想多次模拟按下和释放键,则需要在循环中放置类似于以下行的内容:ui.write(ecodes.EV_KEY, ecodes.KEY_DOWN, 1) #key downui.write(ecodes.EV_KEY, ecodes.KEY_DOWN, 0) #key up@987654329 @
  • 它给了我这个错误:UInputError: "/dev/uinput" cannot be opened for writing 有什么建议吗?
  • 在 /etc/udev/rules.d/50-rogdrv.rules 顶部添加KERNEL=="uinput", MODE="0666 并重新加载规则即可解决问题" (github issue) 你可以像这样重新加载udev规则@ 987654332@(source)
【解决方案2】:

python-uinput:

Linux uinput 内核模块的 Pythonic API...

Python-uinput 是 Linux uinput 内核模块的 Python 接口,它允许将用户空间设备驱动程序附加到内核中。在实践中,Python-uinput 让创建虚拟操纵杆、键盘和鼠标以编程方式生成任意输入事件变得非常简单......

【讨论】:

  • 我可以用小写字母发出吗?请举个例子!!
  • 链接失效
【解决方案3】:

虽然它特定于 X,但您可以安装 xautomation 软件包(在基于 Debian 的系统上为apt-get install xautomation)并使用xte 来模拟按键,例如:

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)

【讨论】:

  • 如何将密钥发送到 shell?
【解决方案4】:

如果您打算在 Linux 上使用它,请尝试使用 pyautogui 库。 对于多个键,您需要使用热键,例如:

pyautogui.hotkey('ctrl', 'c')  # ctrl-c to copy

对我来说它有效 - 请参见此处: How to pass a keystroke (ALT+TAB) using Popen.communicate (on Linux)?

【讨论】:

  • 也适用于 Windows。
【解决方案5】:

如果您使用的是 Windows,请使用 Sendkeys;如果您使用的是 Linux,请尝试使用建议 given here 获取 xsendkeys 或 pexpect。

【讨论】:

    【解决方案6】:

    我发现的最简单的解决方案是使用pynput。您可以执行以下操作:

    from pynput.keyboard import Key, Controller
    
    keyboard = Controller()
    with keyboard.pressed(Key.ctrl):
       keyboard.press(Key.f4)
       keyboard.release(Key.f4)
    

    【讨论】:

      猜你喜欢
      • 2017-07-29
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 2020-07-22
      • 1970-01-01
      • 2021-06-07
      相关资源
      最近更新 更多