前言
我以前写过一些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%的用户影响几乎没有.