如何在没有终端提示的情况下从IPython会话中复制

时间:2016-12-09 23:23:35

标签: python ipython copying

我的工作流程经常涉及IPython shell中的数据清理/修改。自从IPython 5.0版本以及所有伟大的upgrades to the terminal interface以来,这已经变得特别精彩。所以,让我们说我试图修改一些非结构化数据:

In [11]: for i, (num, header, txt) in enumerate(data):
    ...:     header = [e.strip() for e in header.strip().split('\n')]
    ...:     header[4] = header[4].strip(',').split(',')
    ...:     data[i] = (num, header, txt)
    ...:

太棒了,它有效!但现在,我真的想在编辑器中将其添加到脚本中。如果我从终端复制并粘贴,我会捕获左边的所有垃圾。我可以在编辑器中轻松地清理它,但如果我可以直接将代码从终端直接复制到我的剪贴板而不触摸鼠标而且不需要抓取额外的东西,这将是很棒的。在IPython中有这样的功能吗?

5 个答案:

答案 0 :(得分:64)

您可以使用%history魔法从会话中提取有趣的部分。它们将在没有任何垃圾的终端中显示。

实施例

In [1]: import numpy as np    
In [2]: a = np.random(10)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-83ce219ad17b> in <module>()
----> 1 a = np.random(10)

TypeError: 'module' object is not callable

In [3]: a = np.random.random(10)
In [4]: for i in a:
   ...:     print(i)
   ...:     
0.688626523886
[...]
0.341394850998

如果我想保存上面会话的一部分,我可以使用:

In [5]: %history 1 3-4

import numpy as np
a = np.random.random(10)
for i in a:
    print(i)

在上面的示例中,我使用%history 1 3-4来汇编我想要保留的所有命令,并省略了我不需要的命令(第2行,有错误的命令)。现在你的会话版本可以很好地复制。

编写文件

您也可以使用-f FILENAME作为参数直接将此文件写入文件。

In [8]: %history 1 3-4 -f /tmp/foo.py

但请注意,这将覆盖现有文件。 更多细节可以在documentation of the %history magic

中找到

答案 1 :(得分:11)

所以,我终于找到了一个很棒的解决方案,基本上就是我想要的:在IPython中使用Vi模式。在版本5上,这需要:

$ ipython --TerminalInteractiveShell.editing_mode=vi

现在我可以使用方便的vi式视觉模式,并随意抽出任何东西!

这导致我的.bash_profile / .bash_rc中出现以下新别名:

alias vpython='ipython --TerminalInteractiveShell.editing_mode=vi'

答案 2 :(得分:9)

save魔术命令[documentation]将您想要的输入行保存到文件中; -a选项用于“追加”模式,以便在文件末尾添加行而不是覆盖文件。我一直都在使用它。

用你的例子:

%save -a myfile.py 11
# the '%' is not necessary
save -a myfile.py 11

然后你可以在IPython中继续编码。

当您想要写入同一文件的其他命令时,您只需键入save,然后使用向上箭头返回上次使用“保存”(以便-a选项和文件名已经存在)并且只需编辑行号。

请注意,您可以提供多行保存以及行范围:

save -a myfile.py 15 18 19-25

答案 3 :(得分:4)

在shell中,您可以先将IPython文件转换为常规Python文件(.py),然后进行清理:

http://ipython.org/ipython-doc/3/notebook/nbconvert.html(参见 - 脚本格式)

您也可以在笔记本编辑器中将该文件作为Python文件下载,并在此步骤后执行清理。

答案 4 :(得分:1)

我不认为终端应用程序真的可以访问复制/粘贴缓冲区。你将不得不使用鼠标。怎么做取决于你正在使用什么终端。大多数现代终端都有某种“矩形选择”或“块选择”模式。

对于Windows,矩形选择是cmd.exe和Powershell的默认选项。如果你正在使用Cygwin的薄荷,请按住 Alt ,然后用鼠标选择区域。 PuTTY也是如此。

在Linux上(我没有在我面前 - 带上一些盐),xterm不支持​​它,Gnome Terminal使用 Ctrl 作为修饰符,而KDE的Konsole使用 Ctrl + Alt

对于OS X终端,互联网告诉我您在点击时使用

其他终端(和GNU Screen)可能具有该功能,只需要弄清楚如何激活它。