IPython3时代到来

KathrinMark 8年前
   <p>今天 IPython3 被release了. 它带来什么可以看一下 release notes .</p>    <p>好吧, 我也没有意识到ipython3来的会这样快. 这多半年来. 我作为一个150个贡献者之一, 见证了IPython的发展. 这是个里程碑的版本. 他带来了非常多的变化和新的特性. 今天我来帮大家迁移和解读一些吧.</p>    <p>IPython是什么? 本质上它是一个增强版的python交互模式解释器, 所见即所得的执行代码, 查看结果, 也拥有历史记录. 我认为这是一个python开发者必备的工具. 我个人依赖ipython常用的功能有:</p>    <ul>     <li>ipython notebook - 一个可以跑的在线可编辑可运行的笔记. 可以测试程序, 执行代码, 当做说明文档, 能帮助不擅长web开发的同学做出很多页面的效果, 支持markdown语法等</li>     <li>自动补全 - 当我 import xx 的时候 我可以像用zsh一样使用Tab自动补全对应的模块/方法的名字</li>     <li>magic - 它提供很很多magic的函数命令, 比如你可以直接执行ls, pwd等. 还能使用其他shell命令, 调用编辑器等</li>     <li>它能通过?或者??帮我查看代码的注释, 接口参数等等.</li>     <li>它提供很多的配置选择, 可以使用内置/外部插件达到一些其他的功能, 比如autoreload - 你不需要退出ipython就能获得你已经import之后的代码修改后的效果.</li>     <li>它在分布计算, 数据分析上又很好的支持, ipython非常大的使用群体是科学家和算法工程师</li>    </ul>    <p>它在python界有什么地位? 我肯定会带有个人色彩. 来一些github的数据说一说(截止到2015-03-01之前):</p>    <table>     <thead>      <tr>       <th>项目</th>       <th>Issue数</th>       <th>Star数</th>      </tr>     </thead>     <tbody>      <tr>       <td>django</td>       <td>4221</td>       <td>13088</td>      </tr>      <tr>       <td>flask</td>       <td>1359</td>       <td>12810</td>      </tr>      <tr>       <td>tornado</td>       <td>1352</td>       <td>8626</td>      </tr>      <tr>       <td>ipython</td>       <td>7898</td>       <td>5822</td>      </tr>     </tbody>    </table>    <p>这是python最有名的几个项目. 可以看到ipython的star远落后于其他. 但是他的issue数却大大的高于其他, 一方面IPython覆盖的功能和逻辑更多更复杂.</p>    <p>一方面用户对IPython的依赖和兴趣要高很多, 还有一方面IPython也由于内容太多更容易有bug,且主要维护者都是科学家没有太多精力和兴趣做一些基础保障.</p>    <p>可见IPython的知名度不高, 但是对用户粘性却很高.</p>    <p>如何升级</p>    <p>假如你需要使用ipython notebook, 需要使用</p>    <pre>  <code class="language-python">pip install --upgrade "ipython[all]"  </code></pre>    <p>否则直接</p>    <pre>  <code class="language-python">pip install --upgrade ipython  </code></pre>    <p><strong>使用不同的内核(kernel)</strong></p>    <p>IPython的组件大多是核心开发者开发的, 中提到了kernel是这样几个:</p>    <pre>  <code class="language-python">Bash  Echo  Python2  Python3  R  </code></pre>    <p>Bash是这个项目 https://github.com/takluyver/bash_kernel/ , 你可以直接</p>    <pre>  <code class="language-python">sudo pip install bash_kernel  </code></pre>    <p>那么开始说kernel是什么, kernel是一个能执行各种语言的程序封装, 比如可以用notebook跑bash, 跑ruby, 能使用其他语言的语法.</p>    <p>上面的bash就是借用pexpect的 replwrap 实现的bash的封装.对比一下就知道了:</p>    <pre>  <code class="language-python">$/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  </code></pre>    <p>看一下我本地都能用什么kernel:</p>    <pre>  <code class="language-python">$ipython kernelspec list  Available kernels:  python2  python3  bash  echo  </code></pre>    <p>python2就是系统默认的, 原来用的那个. 看到echo和python3的原因在这里:</p>    <pre>  <code class="language-python">$pwd  /Users/dongweiming/.ipython/kernels  $tree  .  ├── echo # 在~/.ipython/kernels有这个echo的目录里面包含了正确地kernel.json就会出现对应的kernel  │   └── kernel.json  ├── echokernel.py  └── python3   └── kernel.json    2directories,3files  </code></pre>    <p>看一下代码:</p>    <pre>  <code class="language-python">$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  </code></pre>    <p>当然这里默认都可以在notebook里使用</p>    <p><strong>Widget</strong></p>    <p>widget系统经过了很大的重构和更新, 全部信息在 widget migration guide .</p>    <p>Widget是什么? 这是ipython notebook的插件系统, 大部分的插件都可以看这里: containers_widgets.ipynb , 看完就知道它是什么和它能做什么了.</p>    <p>在我分享notebook的项目 divingintoipynb 里你能看到我自定义的widget:</p>    <p>selectize_widget.ipynb , 和对应的 widget_selectize.py .</p>    <p><strong>Notebook format</strong></p>    <p>原来的Notebook的版本是3, 现在已经升级为4. 他们是不兼容的版本. 在启动新版IPython访问你的ipynb的时候会出现这样的弹出框:</p>    <pre>  <code class="language-python">This notebook has been converted froman 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 maynotbe able to read the new format. To preserve the original version, close the notebook without saving it.  </code></pre>    <p>你记得保存一下会帮你自动转化为新版本, 下次再启动就可以. 假如由于bug或者其他原因想降级可以这样:</p>    <pre>  <code class="language-python">ipython nbconvert --to notebook --nbformat 3<notebook>  </code></pre>    <p><strong>使用jinja2自定义模板</strong></p>    <p>通过 NotebookApp.extra_template_paths 可以指定外部模板目录, 可以代替默认模板. 或者:</p>    <pre>  <code class="language-python">ipython notebook '--extra_template_paths=["/Users/dongweiming/.ipython/templates/"]'  </code></pre>    <p>比如你不喜欢ipython notebook提供的现有的目录页. 你可以自己写一个叫做tree.html.的模板放在</p>    <p>/Users/dongweiming/.ipython/templates/目录下. 但是建议还是继承原来的tree.html, 再自由发挥.</p>    <p>使用ipython notebook的terminal功能.</p>    <p>在notebook页面上其实是可以直接使用websocket连接到服务器上的. 但是你需要安装 terminado . 这样在/tree下新建的时候就能选择terminal了.</p>    <p><strong>其他</strong></p>    <p>剩下就是一些bug修改, 方法重命名, 功能增强, 去掉一些不再被维护的内容等等. 对95%的用户影响几乎没有.</p>    <p> </p>    <p>来自:http://www.dongwm.com/2015/02/28/ipython3shi-dai-dao-lai/</p>    <p> </p>