IPython3时代到来

IPython3时代到来

前言

我以前写过一些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数

django422113088

flask135912810

tornado13528626

ipython78985822

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

如何升级

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

pipinstall--upgrade"ipython[all]"

否则直接

pipinstall--upgradeipython

使用不同的内核(kernel)

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

BashEchoPython2Python3R

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

sudopipinstallbash_kernel

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

$/usr/local/bin/ipythonIn[1]:echo

---------------------------------------------------------------------------NameErrorTraceback(mostrecentcalllast)in()

---->1echo

NameError:name 'echo' is not defined

In[2]:bc

---------------------------------------------------------------------------NameErrorTraceback(mostrecentcalllast)in()

---->1bcNameError:name'bc' is not defined

$/usr/local/bin/ipythonconsole--kernelbash# 使用bash内核就可以使用这些bash下命令了IPythonConsole3.0.0

In[1]:echo'2-1'2-1

In[2]:echo'2-1'|bc

1

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

$ipythonkernelspeclistAvailablekernels:python2python3bashecho

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

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

看一下代码:

$catecho/kernel.json{"argv":["python","-m","echokernel","-f","{connection_file}"],"display_name":"Echo"}$catpython3/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"}}$ipythonconsole--kernelpython3# 可以在python2下跑python3的代码了In[1]:printOut[1]:In[2]:print'sd'File"",line1print'sd'^SyntaxError:invalidsyntax

更多的自定义请看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的时候会出现这样的弹出框:

Thisnotebookhasbeenconvertedfromanoldernotebookformat(v3)tothecurrentnotebookformat(v4).Thenexttimeyousavethisnotebook,thecurrentnotebookformatwillbeused.OlderversionsofIPythonmaynotbeabletoreadthenewformat.Topreservetheoriginalversion,closethenotebookwithoutsavingit.

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

ipythonnbconvert--tonotebook--nbformat3

使用jinja2自定义模板

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

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

你可能感兴趣的:(IPython3时代到来)