前言

我以前写过一些IPython高级用法, 还有在组内分享了一期IPython notebook的分享. 今天IPython3被release了. 它带来什么可以看一下release notes.
好吧, 我也没有意识到ipython3来的会这样快. 这多半年来. 我作为一个150个贡献者之一, 见证了IPython的发展. 这是个里程碑的版本. 他带来了非常多的变化和新的特性. 今天我来帮大家迁移和解读一些吧.

IPython是什么? 本质上它是一个增强版的python交互模式解释器, 所见即所得的执行代码, 查看结果, 也拥有历史记录. 我认为这是一个python开发者必备的工具. 我个人依赖ipython常用的功能有:

  • ipython notebook - 一个可以跑的在线可编辑可运行的笔记. 可以测试程序, 执行代码, 当做说明文档, 能帮助不擅长web开发的同学做出很多页面的效果, 支持markdown语法等
  • 自动补全 - 当我import xx的时候 我可以像用zsh一样使用Tab自动补全对应的模块/方法的名字
  • magic - 它提供很很多magic的函数命令, 比如你可以直接执行ls, pwd等. 还能使用其他shell命令, 调用编辑器等
  • 它能通过?或者??帮我查看代码的注释, 接口参数等等.
  • 它提供很多的配置选择, 可以使用内置/外部插件达到一些其他的功能, 比如autoreload - 你不需要退出ipython就能获得你已经import之后的代码修改后的效果.
  • 它在分布计算, 数据分析上又很好的支持, ipython非常大的使用群体是科学家和算法工程师

它在python界有什么地位? 我肯定会带有个人色彩. 来一些github的数据说一说(截止到2015-03-01之前):

项目 Issue数 Star数
django 4221 13088
flask 1359 12810
tornado 1352 8626
ipython 7898 5822

这是python最有名的几个项目. 可以看到ipython的star远落后于其他. 但是他的issue数却大大的高于其他, 一方面IPython覆盖的功能和逻辑更多更复杂.
一方面用户对IPython的依赖和兴趣要高很多, 还有一方面IPython也由于内容太多更容易有bug,且主要维护者都是科学家没有太多精力和兴趣做一些基础保障.
可见IPython的知名度不高, 但是对用户粘性却很高.

如何升级

假如你需要使用ipython notebook, 需要使用

1
pip install --upgrade "ipython[all]"

否则直接

1
pip install --upgrade ipython

使用不同的内核(kernel)

IPython的组件大多是核心开发者开发的, 中提到了kernel是这样几个:

1
2
3
4
5
Bash
Echo
Python2
Python3
R

Bash是这个项目https://github.com/takluyver/bash_kernel/, 你可以直接

1
sudo pip install bash_kernel

那么开始说kernel是什么, kernel是一个能执行各种语言的程序封装, 比如可以用notebook跑bash, 跑ruby, 能使用其他语言的语法.
上面的bash就是借用pexpect的replwrap实现的bash的封装.对比一下就知道了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$/usr/local/bin/ipython
In [1]: echo
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-1-53f31a089339> in <module>()
----> 1 echo
NameError: name 'echo' is not defined
In [2]: bc
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-2-b79898bb7907> in <module>()
----> 1 bc
NameError: name 'bc' is not defined
$/usr/local/bin/ipython console --kernel bash # 使用bash内核就可以使用这些bash下命令了
IPython Console 3.0.0
In [1]: echo '2-1'
2-1
In [2]: echo '2-1'|bc
1

看一下我本地都能用什么kernel:

1
2
3
4
5
6
$ipython kernelspec list
Available kernels:
python2
python3
bash
echo

python2就是系统默认的, 原来用的那个. 看到echo和python3的原因在这里:

1
2
3
4
5
6
7
8
9
10
11
$pwd
/Users/dongweiming/.ipython/kernels
$tree
.
├── echo # 在~/.ipython/kernels有这个echo的目录里面包含了正确地kernel.json就会出现对应的kernel
│   └── kernel.json
├── echokernel.py
└── python3
└── kernel.json
2 directories, 3 files

看一下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$cat echo/kernel.json
{"argv":["python","-m","echokernel", "-f", "{connection_file}"],
"display_name":"Echo"
}
$cat python3/kernel.json
{
"display_name": "IPython (Python 3)",
"language": "python",
"argv": [
"python3",
"-c", "from IPython.kernel.zmq.kernelapp import main; main()",
"-f", "{connection_file}"
],
"codemirror_mode": {
"version": 2,
"name": "ipython"
}
}
$ipython console --kernel python3 # 可以在python2下跑python3的代码了
In [1]: print
Out[1]: <function print>
In [2]: print 'sd'
File "<ipython-input-2-f747b7d9e029>", line 1
print 'sd'
^
SyntaxError: invalid syntax

更多的自定义请看Wrapper kernels

当然这里默认都可以在notebook里使用

Widget

widget系统经过了很大的重构和更新, 全部信息在widget migration guide.

Widget是什么? 这是ipython notebook的插件系统, 大部分的插件都可以看这里: containers_widgets.ipynb, 看完就知道它是什么和它能做什么了.
在我分享notebook的项目divingintoipynb里你能看到我自定义的widget:
selectize_widget.ipynb, 和对应的widget_selectize.py.

custom.js在使用的时候也有了很大的变动, 可以看我分享项目的custom.js

Notebook format

原来的Notebook的版本是3, 现在已经升级为4. 他们是不兼容的版本. 在启动新版IPython访问你的ipynb的时候会出现这样的弹出框:

1
This notebook has been converted from an older notebook format (v3) to the current notebook format (v4). The next time you save this notebook, the current notebook format will be used. Older versions of IPython may not be able to read the new format. To preserve the original version, close the notebook without saving it.

你记得保存一下会帮你自动转化为新版本, 下次再启动就可以. 假如由于bug或者其他原因想降级可以这样:

1
ipython nbconvert --to notebook --nbformat 3 <notebook>

使用jinja2自定义模板

通过NotebookApp.extra_template_paths可以指定外部模板目录, 可以代替默认模板. 或者:

1
ipython notebook '--extra_template_paths=["/Users/dongweiming/.ipython/templates/"]'

比如你不喜欢ipython notebook提供的现有的目录页(http://localhost:8000/tree这样的路径). 你可以自己写一个叫做tree.html.的模板放在
/Users/dongweiming/.ipython/templates/目录下. 但是建议还是继承原来的tree.html, 再自由发挥.

使用ipython notebook的terminal功能.

在notebook页面上其实是可以直接使用websocket连接到服务器上的. 但是你需要安装terminado. 这样在/tree下新建的时候就能选择terminal了.

其他

剩下就是一些bug修改, 方法重命名, 功能增强, 去掉一些不再被维护的内容等等. 对95%的用户影响几乎没有.