前言

我以前写过一些 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, 需要使用

pip install --upgrade "ipython[all]"

否则直接

pip install --upgrade ipython

使用不同的内核 (kernel)

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

Bash
Echo
Python2
Python3
R

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

sudo pip install bash_kernel

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

$/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:

$ipython kernelspec list
Available kernels:
python2
python3
bash
echo

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

$pwd
/Users/dongweiming/.ipython/kernels
$tree
.
├── echo # 在~/.ipython/kernels有这个echo的目录里面包含了正确地kernel.json就会出现对应的kernel
   └── kernel.json
├── echokernel.py
└── python3
    └── kernel.json

2 directories, 3 files

看一下代码:

$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 的时候会出现这样的弹出框:

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 或者其他原因想降级可以这样:

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

使用 jinja2 自定义模板

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

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% 的用户影响几乎没有.