ipython在ssh终端中缓慢执行xdotool命令

我遇到了一个我不确定如何调试的行为。

基本设置

编辑python文件时,我有一个vim脚本与IPython进行交互。 基本上它会运行我在光标处选择的任何命令。 它工作得很好,每生产力提高一吨。 但是,有一个问题。 当IPython终端处于SSH窗口时,速度非常慢。 这可能是一个很小的问题,所以我会尽可能地解释它,并在可能的情况下给予MWE,但这里有很多组件。

我在Ubuntu Linux 16.04上运行客户端和服务器系统上的Gnome 3前端。 IPython是版本5.2.2。 我的终端是终结者。

初始实验

当vim收到一个is时,执行这个基本脚本:

  • 将当前行复制到系统剪贴板。
  • 预处理文本以修复任何缩进问题。
  • 使用wmctrl查找并记住我的gvim窗口的窗口ID。
  • 使用wmctrl查找最近选择的终端窗口的窗口ID(这通常是运行IPython的窗口)。
  • 使用wmctrl专注于IPython窗口
  • 使用xdotool发送ctrl + shift + v键序列。 这会将文本粘贴到IPython提示符中。
  • 使用xdotool发送KP_Enter,它将在IPython提示符下执行代码。
  • 使用wmctrl将焦点返回到gvim窗口,这使得交互变得wmctrl (通常,但在这种情况下不会)。
  • 在脚本的后半部分,它会等待.01秒以让每个命令执行。

    我写了一些调试文本以及时间戳,看看我是否可以确定需要花费多长时间。

    1496591696.3065512 
    ----
    CopyGVimToTerminalDev
    1496591696.3065684 mode = 'n'
    1496591696.3065758 return_to_vim = '1'
    1496591696.3065836 grabbing text at current line
    1496591696.3066013 preparing text
    1496591696.3066237 copying text to clipboard
    1496591696.3157291 copied text to clipboard
    1496591696.315782 Running script
    Executing x do: (
        ('remember_window_id', 'ACTIVE_GVIM'),
        ('focus', 'x-terminal-emulator.X-terminal-emulator'),
        ('key', 'ctrl+shift+v'),
        ('key', 'KP_Enter'),
        ('focus_id', '$ACTIVE_GVIM'),
    )
    # Step 0
    [] 
    # Step 1
    ['wmctrl', '-ia', '0x2400004'] wmctrl -ia 0x2400004
    # Step 2
    ['xdotool', 'key', 'ctrl+shift+v'] xdotool key ctrl+shift+v
    # Step 3
    ['xdotool', 'key', 'KP_Enter'] xdotool key KP_Enter
    # Step 4
    ['wmctrl', '-ia', '0x3400003'] wmctrl -ia 0x3400003
    1496591696.550773 Finished script
    

    你可以看到脚本开始于1496591696.3065684,然后很快就完成了第一部分,到了1496591696.315782,到目前为止只有~01秒,并且不明显。 然后执行wmctrlxdotool命令。 这些被称为使用Python的子处理模块。 总的来说,整个脚本在1496591696.550773处结束,总共只有0.2秒,这一点也不是很明显。

    所以,剧本本身很快。 但是当我查看IPython终端时,至少1秒或2秒没有任何事情发生。 我相信这是因为当xdotool执行时它会很快返回,但是发送的关键序列会停留在某处的某个缓冲区并永久存在。

    最小例子

    所以,我确定这个问题不在我的脚本中。 这可能与ipython,ssh和/或xdotool的组合有关。 这是一个重现此问题的MWE:

  • 打开一个终端窗口。
  • 使用wmctrl -lx查找终端窗口的ID。
  • SSH到远程机器并启动ipython
  • 打开第二个终端窗口。
  • 将任何虚拟文本复制到剪贴板中。
  • 执行此测试命令(使用正确的窗口ID):

    wmctrl -ia 0x2400004 && xdotool key ctrl+shift+v && xdotool key KP_Enter

  • 当我这样做时,同样的缓慢发生。 它很快切换到终端窗口,我可以看到测试命令在我的第二个终端中完成,但粘贴的文本在IPython中没有出现约4秒钟(手动计数)。

    最小例子的变化

    这些变化导致行为消失:

    直接粘贴如果您只是选择IPython窗口并按下ctrl + shift + v,则文本将被毫不拖延地粘贴。 有关窗口的东西正集中通过wmctrl或按Ctrl + Shift + V命令通过发送xdotool必须贡献的问题。

    粘贴到bash提示符中如果不启动IPython并执行测试命令,则复制的文本会很快粘贴到SSH bash提示符中。 所以IPython正在为这个问题做出贡献。

    tmux使行为消失这最后一个变化是非常奇怪的,但可能表明潜在的问题。 如果不是open terminal -> ssh -> start ipython ,我open terminal -> ssh -> start tmux -> start ipython ,然后运行测试脚本也快速复制文本。 我猜测tmux会替换输入缓冲区,但我真的不知道有关I / O细节的信息,以便知道它是什么。


    所以,我认为当IPython直接通过SSH接收IO并且xdotool是发送IO的IO时,我已经能够确定这是一个奇怪的I / O缓冲区问题。 但是现在我不知道如何着手解决问题或者甚至可以解决问题。

    它很好,我发现了tmux的解决方法,但是强制自己进入这些交互式会话的tmux可能会限制输出从终端输出滚动/复制到我的客户端机器。 它也阻止我做一些需要X11转发的事情。 我宁愿能够直接在ssh中工作。

    所以,如果有人有任何想法,我真的很感谢这个帮助。

    链接地址: http://www.djcxy.com/p/68943.html

    上一篇: ipython in ssh terminal executes xdotool commands slowly

    下一篇: How do I add python3 kernel to jupyter (IPython)