IPython3時代到來
今天 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
2directories,3files
看一下代碼:
$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
當然這里默認都可以在notebook里使用
Widget
widget系統經過了很大的重構和更新, 全部信息在 widget migration guide .
Widget是什么? 這是ipython notebook的插件系統, 大部分的插件都可以看這里: containers_widgets.ipynb , 看完就知道它是什么和它能做什么了.
在我分享notebook的項目 divingintoipynb 里你能看到我自定義的widget:
selectize_widget.ipynb , 和對應的 widget_selectize.py .
Notebook format
原來的Notebook的版本是3, 現在已經升級為4. 他們是不兼容的版本. 在啟動新版IPython訪問你的ipynb的時候會出現這樣的彈出框:
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.
你記得保存一下會幫你自動轉化為新版本, 下次再啟動就可以. 假如由于bug或者其他原因想降級可以這樣:
ipython nbconvert --to notebook --nbformat 3<notebook>
使用jinja2自定義模板
通過 NotebookApp.extra_template_paths 可以指定外部模板目錄, 可以代替默認模板. 或者:
ipython notebook '--extra_template_paths=["/Users/dongweiming/.ipython/templates/"]'
比如你不喜歡ipython notebook提供的現有的目錄頁. 你可以自己寫一個叫做tree.html.的模板放在
/Users/dongweiming/.ipython/templates/目錄下. 但是建議還是繼承原來的tree.html, 再自由發揮.
使用ipython notebook的terminal功能.
在notebook頁面上其實是可以直接使用websocket連接到服務器上的. 但是你需要安裝 terminado . 這樣在/tree下新建的時候就能選擇terminal了.
其他
剩下就是一些bug修改, 方法重命名, 功能增強, 去掉一些不再被維護的內容等等. 對95%的用戶影響幾乎沒有.
來自:http://www.dongwm.com/2015/02/28/ipython3shi-dai-dao-lai/