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秒,并且不明显。 然后执行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
或按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