附录B 更多IPython系统相关内容
B.1 使用命令历史
IPython维护一个小的磁盘数据库,其中包含你执行的每条命令的文本。这些文本有多种用途:
· 以最少的打字搜索、完成并执行先前执行过的命令
· 在会话之间保持命令历史记录
· 将输入/输出历史日志,记录到文件
这些功能在命令行中比在notebook中更有用,因为notebook在设计时就设计成了会记录每个代码单元中的输入和输出。
B.1.1 搜索和复用命令历史
IPython命令行允许你搜索并执行先前的代码或其他命令。这很有用,因为你经常会发现自己重复执行相同的命令,例如% run命令或其他代码片段。假设你运行了下面的代码:
In[7]: %run first/second/third/data_script.py
然后探索脚本的结果(假设它成功运行),只是发现你做出了错误的计算。找出问题并修改data_script.py后,可以开始输入% run命令的几个字母,然后按下Ctrl-P组合键或向上箭头键。这将搜索与你输入的字母匹配的第一个先前命令的命令历史记录。多次按下Ctrl-P或向上箭头键将继续搜索历史记录。如果你错过了你想执行的命令,不要害怕。你可以通过按Ctrl-N或向下箭头键在命令历史记录中前进。这样做几次之后,你可以开始按这些键而不用考虑!
使用Ctrl-R可以为你提供相同的部分增量搜索功能,这种功能在Unix风格的命令行(比如bash shell)中由readline提供。在Windows上,readline功能由IPython模拟。要使该功能,请按Ctrl-R,然后键入要搜索的输入行中包含的几个字符:
In [1]: a_command = foo(x, y, z)
(reverse-i-search)`com': a_command = foo(x, y, z)
按Ctrl-R键将循环查看与你输入的字符相匹配的每行历史记录。
B.1.2 输入和输出变量
忘记将函数调用的结果赋值给变量是非常恼人的。IPython会话存储对输入和输出命令的引用,并将特定变量中的Python对象输出。前两个输出分别存储在_(一个下划线)和__(两个下划线)变量中(见图1)
输入变量存储在名为_iX的变量中,其中X是输入行号。对于每个输入变量,都有一个对应的输出变量_X。因此,在输入行4之后,比方说,输入中会有两个新变量_4(用于输出)和_i4(见图2)
由于输入变量是字符串,因此可以使用Python exec关键字再次执行它们(见图3)
这里_i4代表In [4]中的代码输入。
一些魔术函数可以让你处理输入和输出历史。% hist可以用包含或不包含行号的形式打印全部或部分输入历史记录。% reset用于清除交互式命名空间以及可选的输入和输出缓存。% xdel魔术函数用于从IPython机器中移除对特定对象的所有引用。有关更多详细信息,请参阅这些魔术方法的文档。
在处理非常大的数据集时,请记住,即使使用del关键字从交互式命名空间中删除变量,IPython的输入和输出历史记录也会导致引用的所有对象不会被垃圾回收(释放内存)。在这种情况下,小心使用% xdel和% reset可以帮助您避免遇到内存问题。