IPython

IPython 是一个增强了交互能力的 Python REPL 环境,IPython v1-3 版本安装同时会安装
IPython notebook,相当于一个网页版的 REPL 环境。
相对于原生的 Python REPL,IPython 主要提供了 Tab 自动补全、shell 命令交互、
快速文档查询等功能。
除了在 shell 中使用外,Django shell 以及 PyCharm IDE 都提供了 IPython 的支持——
安装了 IPython 后会选择其作为默认 python shell。

启动 & 退出

启动 IPython:ipython

启动 IPython notebook:ipython notebook

启动 IPython Qt shell:ipython qtshell

退出:双击 Ctrl-D 或者 exit 或者 quit 或者 exit()

特性

Tab 补全

原生的 Python shell 可以通过 rlcompleterreadline 库获得 Tab 补全能力:

  1. import rlcompleter, readline
  2. readline.parse_and_bind('tab: complete')

IPython 的支持更强大一些。不过 IPython 的自动补全依旧是循环式的,需要菜单式的可以试试 ptpython。

魔法指令(Magic Command)

魔法指令是 IPython 定义的命令,以提供 IPython 环境下与环境交互的能力,通常对应于 shell 命令。
你可以在 IPython 控制台中输入 ls 或者 %ls 来查看当前目录文件。

魔法指令通常以 % 开始,对于非 % 开始的魔法指令,IPython 会首先判断它是不是
Python 对象,如是对象则优先作为 Python 对象处理。

更全面的 magic 命令列表和功能介绍见这里

魔法指令中还包括了很多 Shell 命令,但并不是全部,IPython 也支持直接执行 Shell
命令,只需要以感叹号 ! 起始,例如:!ls

Plot

常见用法是配合 mathplotlib 等 plot 库和 IPython 插件,在终端、Qt console 或者 Notebook
中展示图表。

内省

函数内省

IPython 提供了 ??? 命令用于内省,? 会显示函数简介,?? 会连源代码一起显示
(如果可用的话)。

输入历史

hist 魔法指令可以用来输出输入历史:

  1. In [7]: hist
  2. 1: a = 1
  3. 2: b = 2
  4. 3: c = 3
  5. 4: d = {}
  6. 5: e = []
  7. 6: for i in range(20):
  8. e.append(i)
  9. d[i] = b

要去掉历史记录中的序号,使用命令 hist -n

  1. In [8]: hist -n
  2. a = 1
  3. b = 2
  4. c = 3
  5. d = {}
  6. e = []
  7. for i in range(20):
  8. e.append(i)
  9. d[i] = b

这样你就可以方便的将代码复制到一个文本编辑器中。

要在历史记录中搜索可以先输入一个匹配模型,然后按 Ctrl-p ,找到一个匹配后,继续按
Ctrl-p 会向后搜索再上一个匹配,Ctrl-n 则是向前搜索最近的匹配。

编辑

当在 Python 提示符下试验一个想法时,经常需要通过编辑器修改源代码(甚至是反复修改)。
在 IPython 下输入魔法指令 edit 就会根据环境变量 $EDITOR 调用相应的编辑器。
如果 $EDITOR 为空,则会调用 vi(Unix)或记事本(Windows)。
要回到 IPython 提示符,直接退出编辑器即可。

如果是保存并退出编辑器,输入编辑器的代码会在当前名字空间下被自动执行。
如果你不想这样,使用 edit -x。如果要再次编辑上次最后编辑的代码,使用 edit -p
在上一个特性里,我提到使用 hist -n 可以很容易的将代码拷贝到编辑器。
一个更简单的方法是 edit 加 Python 列表的切片(slice)语法。假定 hist 输出如下:

  1. In [29]: hist -n
  2. a = 1
  3. b = 2
  4. c = 3
  5. d = {}
  6. e = []
  7. for i in range(20):
  8. e.append(i)
  9. d[i] = b

现在要将第 4、5、6 句代码导出到编辑器,只要输入:

  1. edit 4:7

交互调试

调试方面常用的魔术命令有 rupruntimetimeit 等等。更直接的方式是借助系统调试工具 pdb。

快捷键及配置

作为库使用

NotFinished,虽然ipython -p pysh提供了一个强大的shell替代品,但它缺少正确的job控制。在运行某个很耗时的任务时按下Ctrl-z将会停止IPython session而不是那个子进程。

问题和方法

虽然作为标准 Python Shell 的替代,IPython 总的来说很完美,但仍然存在一些问题。

粘贴代码缩进问题

默认情况下,IPython 会对粘贴的已排好缩进的代码重新缩进。例如下面的代码:

  1. for i in range(10):
  2. for j in range(10):
  3. for k in range(10):
  4. pass

会变成:

  1. for i in range(10):
  2. for j in range(10):
  3. for k in range(10):
  4. pass

这是因为 autoindent 默认是启用状态,可以用 magic 命令 autoindent 来开关自动缩进,
就像在 Vim 中设置 set paste 一样。

或者,你也可以使用魔法指令 %paste 粘贴并执行剪贴板中的代码。

Vim 模式

Mac 下的快捷启动

IPython wiki 提供了一段 AppleScript launcher 脚本,把它写入 ~/bin/ipy
在 Mac Spotlight 中输入 ipy 并回车就可以在新 iTerm 窗口中打开 IPython Shell。
下面是我稍微修改后的版本:

  1. #!/usr/bin/osascript
  2. -- Run ipython on a new iTerm
  3. -- See http://www.iterm2.com/#/section/documentation/scripting
  4. tell application "iTerm"
  5. activate
  6. set ipyterm to (make new terminal)
  7. tell ipyterm
  8. set ipysession to (make new session)
  9. tell ipysession
  10. set name to "IPython"
  11. exec command "${which ipython}"
  12. end tell
  13. end tell
  14. end tell

IPython notebook

启动

在终端输入: ipython notebook

IPython notebook 的使用和 Vim 有些类似,分“命令模式”和“编辑模式”,切换方法同样为 ESC 键。
在命令模式下按 h 可以呼出帮助菜单,貌似不区分大小写。