【问题标题】:How can I use xdotool from within a python module/script?如何在 python 模块/脚本中使用 xdotool?
【发布时间】:2012-03-13 10:07:16
【问题描述】:

例如,如果我想使用类似的东西:

xdotool mousemove 945 132
xdotool click 1

为了将鼠标移动到某个位置并点击。在 ubuntu 中,我可以直接在终端中输入这些命令以获得所需的效果,但我想将它们放在 Python 脚本中。

【问题讨论】:

标签: python ubuntu


【解决方案1】:
import subprocess

subprocess.call(["xdotool", "mousemove", "945", "132"])

等等。请参阅subprocess 文档。

【讨论】:

    【解决方案2】:

    截至 2015 年,您还可以使用这个 python 包: https://github.com/rshk/python-libxdo

    【讨论】:

    • 这似乎非常有限。在源代码中,我看到了 keydown 和 keyup 的绑定,但是在 ipython3 中执行 import xdo; x=xdo.xdo() 并使用 x.<Tab> 检查自动完成,它们只是不存在。查看单元测试,作者的主要目标似乎是鼠标移动。已经实现的东西是错误的:x.send_keysequence_window("A") 有效,但 x.send_keysequence_window("Alt+Tab") 无效(尽管它识别组合,因为例如“Alt,Tab”给出错误)。 delay=x 参数被识别但什么都不做。
    • 它现在似乎没有维护——我有一个分支版本python-libxdo-ng,它修复了一些错误。这个解决方案可以比subprocess快100倍
    【解决方案3】:

    我已经将 xdotool 与 sh 和 os.system 一起使用了一段时间,但我决定更新所有内容以使用子进程。这样做我遇到了一些小故障,并在谷歌搜索中发现了the libxdo python module suggested by Simon。 Python3 有一个小问题——它使用字节串——但是转换很简单,而且它比旧的两步过程运行得更顺畅、更可靠。

    这里有一个小代码可能会有所帮助(显然哈希爆炸需要匹配您的 python 路径)。这两个函数包括转换为 Python 3 的字节串 (ascii),因此 .encode() 可以在 Python 2 中省略。

    #!/home/john/anaconda3/bin/python3.6
    import sys
    from xdo import Xdo
    from time import sleep
    
    def sendkeys(*keys):
        for k in keys: xdo.send_keysequence_window(0, k.encode())
    
    def type(text):
        xdo.enter_text_window(0, text.encode())
    
    sleep(0.5)
    xdo = Xdo()
    
    # this updates a row in a spreadsheet with copies from prior row
    # first check that this is the intended spreadsheet
    if 'Trades' in xdo.get_window_name(xdo.get_active_window()).decode():
        with open('my_data_file_name', 'r') as f:
            trade = (f.readlines()[-int(sys.argv[1])])[:-1]
            t = [s if s else '0' for s in trade.split('\t')]
            type('\t'.join(t[:7]))
            sendkeys('Tab', 'Up', 'ctrl+c', 'Down', 'ctrl+v', 'Right')
            type(' ' + t[-3])
            sendkeys('Tab')
            type(t[-2])
            sendkeys('Tab')
            type(t[-1])
            sendkeys('Tab', 'Up', 'ctrl+c', 'Down', 'ctrl+v', 'Right')
            type('333')
            sendkeys('Tab')
    

    【讨论】:

    • from xdo import Xdo 现在出现错误,似乎应该是import xdo; x = xdo.xdo()(最好不要使用“from ... import”,因此如果需要,您可以使用xdo.CURRENTWINDOW
    • 上述语法在使用 Python 3.8.2rc2 和 python-libxdo 0.1.2a1 的 Linux 中仍然没有错误。 i.imgur.com/uSVUBjX.png 所以我不确定你面临的问题发生在哪里。不过,请随时根据您的情况调整我的示例。
    • 我正在使用来自 Debian 存储库的 python3-xdo 版本 0.4-1。我想这会有所不同。
    • 听起来不错。尝试卸载它,然后使用sudo python3 -m pip install --upgrade python-libxdo,这可能会为您提供当前版本。我使用 MITx 6.00.1x 和 .2x,所以我的机器上往往有很多 Python。基本上编译,altinstall 然后使用 pip 来获取最新的兼容模块版本。我很想知道 pip 是否会给你当前版本@Luc,如果你愿意让我知道的话。
    • 嗯等等我们使用完全不同的包。通常,Debian 存储库中的 python3-$name 与 pip3 中名为 $name 的软件包相同,但似乎 libxdo 在存储库中不可用。这是存储库中的内容:salsa.debian.org/python-team/modules/python-xdo 这解释了为什么我有 0.4,而您要求我尝试“升级”到最新版本,就像您一样,0.1:P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2013-11-06
    • 2017-06-21
    • 2014-03-24
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    相关资源
    最近更新 更多