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

时间:2017-06-04 16:51:37

标签: linux ssh io ipython xdotool

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

基本设置

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

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

初步实验

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

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

在脚本的后半部分,等待.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聚焦的窗口或由xdotool发送的ctrl + shift + v命令的某些内容必然会导致问题。

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

tmux使行为消失 最后一个变化真的很奇怪,但可能表明潜在的问题。如果不是open terminal -> ssh -> start ipython,而是open terminal -> ssh -> start tmux -> start ipython,那么运行测试脚本也会快速复制文本。我猜测tmux会替换输入缓冲区,但我对I / O细节知之甚少,不知道那是什么。

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

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

所以,如果有人有任何想法,我真的很感激这方面的一些帮助。

0 个答案:

没有答案