使用命令历史
IPython维护着一个位于硬盘上的小型数据库,其中含有你执行过的每条命令的文本。这样做有几个目的:
·只需很少的按键次数即可搜索、自动完成并执行之前已经执行过的命令。
·在会话间持久化命令历史。
·将输入/输出历史记录到日志文件。
图3-3:pylab模式:IPython和matplotlib窗口
搜索并重用命令历史
对于许多人来说,能够搜索并执行前面的命令是非常有用的功能。IPython倡导的是一种迭代的、交互式的开发模式:你可能常常会发现自己总是在重复输入相同的命令(比如%run命令或其他的代码片段)。假设你已经执行了:
- In[7]: %run first/second/third/data_script.py
而在查看其执行结果后(假设其已经成功执行完毕)发现计算过程不对。在找出问题原因并修改了data_script.py之后,只需输入%run命令的前几个字符并按"Ctrl-P"键或上箭头键即可。这样就会搜索出命令历史中第一个与你输入的字符相匹配的命令。多次按"Ctrl-P"键或上箭头键就会在命令历史中不断搜索。如果你错过了想要的那条命令也没关系,你可以按"Ctrl-N"键或下箭头键在命令历史中前向搜索。只要多操作几次,以后你会想都不想地按下这些键!
"Ctrl-R"用于实现部分增量搜索,跟UNIX型shell中的readline所提供的功能一样。在Windows上,IPython模拟了readline功能。按下"Ctrl-R"并输入你想搜索的行中的几个字符:
- In [1]: a_command = foo(x, y, z)
- (reverse-i-search)`com': a_command = foo(x, y, z)
按下"Ctrl-R"将会循环搜索命令历史中每一条与输入相符的行。
输入和输出变量
忘记把函数结果赋值给变量是一件让人很郁闷的事情。好在IPython会将输入(你输入的那些文本)和输出(返回的对象)的引用保存在一些特殊变量中。最近的两个输出结果分别保存在(一个下划线)和_(两个下划线)变量中:
- In [556]: 2 ** 27
- Out[556]: 134217728
- In [557]: _
- Out[557]: 134217728
输入的文本被保存在名为_iX的变量中,其中X是输入行的行号。每个输入变量都有一个对应的输出变量_X。比如说,在输入完第27行后,就会产生两个新变量_27(输出变量)和_i27(输入变量)。
- In [26]: foo = 'bar'
- In [27]: foo
- Out[27]: 'bar'
- In [28]: _i27
- Out[28]: u'foo'
- In [29]: _27
- Out[29]: 'bar'
由于输入变量是字符串,因此可以用Python的exec关键字重新执行:
- In [30]: exec _i27
有几个魔术命令可用于控制输入和输出历史。%hist用于打印全部或部分输入历史,可以选择是否带行号。%reset用于清空interactive命名空间,并可选择是否清空输入和输出缓存。%xdel用于从IPython系统中移除特定对象的一切引用。详细信息请参考相应魔术命令的文档。
警告: 在处理非常大的数据集时,一定要注意IPython的输入输出历史,它会导致所有对象引用都无法被垃圾收集器处理(即释放内存),即使用del关键字将变量从interactive命名空间中删除也不行。对于这种情况,谨慎地使用%xdel和%reset将有助于避免出现内存方面的问题。
记录输入和输出
IPython能够记录整个控制台会话,包括输入和输出。执行%logstart即可开始记录日志:
- In [3]: %logstart
- Activating auto-logging. Current session state plus future input saved.
- Filename : ipython_log.py
- Mode : rotate
- Output logging : False
- Raw input log : False
- Timestamping : False
- State : active
IPython的日志功能可以在任何时刻开启,它将记录你的整个会话(包括此前的命令)。因此,如果你在写代码的过程中,突然想要保存所有工作的时候,直接启动日志功能就行了。%logstart的具体选项(比如修改输出文件路径)请参考其文档,此外还可以看看几个与之配套的魔术命令%logoff、%logon、%logstate以及%logstop。