B.1 使用命令历史

Ipython维护了一个位于磁盘的小型数据库,用于保存执行的每条指令。它的用途有:

  • 只用最少的输入,就能搜索、补全和执行先前运行过的指令;
  • 在不同session间保存命令历史;
  • 将日志输入/输出历史到一个文件

这些功能在shell中,要比notebook更为有用,因为notebook从设计上是将输入和输出的代码放到每个代码格子中。

搜索和重复使用命令历史

Ipython可以让你搜索和执行之前的代码或其他命令。这个功能非常有用,因为你可能需要重复执行同样的命令,例如%run命令,或其它代码。假设你必须要执行:

  1. In[7]: %run first/second/third/data_script.py

运行成功,然后检查结果,发现计算有错。解决完问题,然后修改了data_script.py,你就可以输入一些%run命令,然后按Ctrl+P或上箭头。这样就可以搜索历史命令,匹配输入字符的命令。多次按Ctrl+P或上箭头,会继续搜索命令。如果你要执行你想要执行的命令,不要害怕。你可以按下Ctrl-N或下箭头,向前移动历史命令。这样做了几次后,你可以不假思索地按下这些键!

Ctrl-R可以带来如同Unix风格shell(比如bash shell)的readline的部分增量搜索功能。在Windows上,readline功能是被IPython模仿的。要使用这个功能,先按Ctrl-R,然后输入一些包含于输入行的想要搜索的字符:

  1. In [1]: a_command = foo(x, y, z)
  2. (reverse-i-search)`com': a_command = foo(x, y, z)

Ctrl-R会循环历史,找到匹配字符的每一行。

输入和输出变量

忘记将函数调用的结果分配给变量是非常烦人的。IPython的一个session会在一个特殊变量,存储输入和输出Python对象的引用。前面两个输出会分别存储在 (一个下划线)和 _(两个下划线)变量:

  1. In [24]: 2 ** 27
  2. Out[24]: 134217728
  3. In [25]: _
  4. Out[25]: 134217728

输入变量是存储在名字类似_iX的变量中,X是输入行的编号。对于每个输入变量,都有一个对应的输出变量_X。因此在输入第27行之后,会有两个新变量_27 (输出)和_i27(输入):

  1. In [26]: foo = 'bar'
  2. In [27]: foo
  3. Out[27]: 'bar'
  4. In [28]: _i27
  5. Out[28]: u'foo'
  6. In [29]: _27
  7. Out[29]: 'bar'

因为输入变量是字符串,它们可以用Python的exec关键字再次执行:

  1. In [30]: exec(_i27)

这里,_i27是在In [27]输入的代码。

有几个魔术函数可以让你利用输入和输出历史。%hist可以打印所有或部分的输入历史,加上或不加上编号。%reset可以清理交互命名空间,或输入和输出缓存。%xdel魔术函数可以去除IPython中对一个特别对象的所有引用。对于关于这些魔术方法的更多内容,请查看文档。

警告:当处理非常大的数据集时,要记住IPython的输入和输出的历史会造成被引用的对象不被垃圾回收(释放内存),即使你使用del关键字从交互命名空间删除变量。在这种情况下,小心使用xdel %和%reset可以帮助你避免陷入内存问题。