我遇到了一种我不确定如何调试的行为。
我有一个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秒而且不明显。然后它执行wmctrl
和xdotool
命令。这些是使用python的子处理模块调用的。整体而言,整个脚本的完成时间为1496591696.550773,总共只有约0.2秒,这也不是很明显。
因此,脚本本身很快。但是当我看到IPython终端时,至少1或2秒钟没有任何反应。我相信这是因为当xdotool执行它时会快速返回,但是发送的键序列被卡在某个缓冲区某处并永远消失。
所以,我已经确定问题不在我的脚本中。它与ipython,ssh和/或xdotool的某些组合有关。 这是一个重现问题的MWE:
wmctrl -lx
找到终端窗口的ID。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中工作。
所以,如果有人有任何想法,我真的很感激这方面的一些帮助。