如何从IPython会话复制没有terminal提示

我的工作stream程经常涉及IPython shell中的数据清理/清理。 自从IPython 5.0版本升级到terminal界面之后,这已经变得特别精彩。 所以,假设我试图弄清楚一些非结构化数据:

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) ...: 

神奇的,它的作品! 但现在,我真的很想在编辑器中添加这个脚本。 如果我从terminal复制并粘贴,我会捕获左侧的所有垃圾。 我可以在一个编辑器中或多或less简单地清理它,但是如果我可以直接将代码从terminal复制到我的剪贴板而不用触摸鼠标,也不需要额外的东西,那就太棒了。 IPython中有这样的function吗?

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

 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 

但要小心,这将覆盖现有的文件 。 更多细节可以在%history魔法的文档中find。

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

 $ ipython --TerminalInteractiveShell.editing_mode=vi 

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

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

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

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

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

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

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

在Windows中,矩形select是cmd.exe和Powershell的默认选项。 如果您使用Cygwin的mintty,按住Alt ,然后用鼠标select区域。 PuTTY也是一样。

在Linux上(我没有在这里面 – 拿一点盐),xterm不支持​​它,Gnome Terminal使用Ctrl作为修饰符,而KDE的Konsole使用Ctrl + Alt

对于OS Xterminal,互联网告诉我你点击时使用

其他terminal(和GNU屏幕)可能有这个function,这只是一个搞清楚如何激活它的问题。

save magic命令[ documentation ]将你想要的input行保存到一个文件中; -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