概述
iPython 是一個Python 的互動式Shell,比預設的Python Shell 好用得多,功能也更強大。
她支援文法高亮、自動完成、代碼調試、對象自省,支援 Bash Shell 命令,內建了許多
很有用的功能和函式等,非常容易使用。
應用
Windows 下的iPython 安裝
在Windows 下安裝iPython 可分為以下幾步:
1. 下載ipython-0.8.4.win32-setup.exe 和pyreadline-1.5-win32-setup.exe。
(1)下載ipython-0.8.4.win32:http://ipython.scipy.org/dist/ipython-0.8.4.win32-setup.exe
精巧地址:http://bit.ly/YqbkJ
(2)下載pyreadline-1.5-win32:http://ipython.scipy.org/dist/pyreadline-1.5-win32-setup.exe
精巧地址:http://bit.ly/2JFKDM 安裝pyreadline。直接雙擊安裝
ubuntu 下安裝
sudo apt-get install 'ipython'
在互動環境和在Python 預設互動環境中一樣,編寫代碼進行調試、測試等。但比預設
Python 環境好的幾點如下所示。
1. Magic。iPython 有一些“magic”關鍵字:
%Exit, %Pprint, %Quit, %alias, %autocall, %autoindent, %automagic,
%bookmark, %cd, %color_info, %colors, %config, %dhist, %dirs, %ed,
%edit, %env, %hist, %logoff, %logon, %logstart, %logstate, %lsmagic,
%macro, %magic, %p, %page, %pdb, %pdef, %pdoc, %pfile, %pinfo, %popd,
%profile, %prun, %psource, %pushd, %pwd, %r, %rehash, %rehashx, %reset,
%run, %runlog, %save, %sc, %sx, %system_verbose, %unalias, %who,
%who_ls, %whos, %xmode
iPython 會檢查傳給它的命令是否包含magic 關鍵字。如果命令是一個magic 關鍵字,
iPython 就自己來處理。如果不是magic 關鍵字,就交給 Python 去處理。如果
automagic 開啟(預設),不需要在magic 關鍵字前加%符號。相反,如果automagic
是關閉的,則%是必須的。在命令提示字元下輸入命令magic 就會顯示所有magic 關鍵
字列表,以及它們簡短的用法說明。良好的文檔對於一個軟體的任何一部分來說都
是重要的,從線上iPython 使用者手冊到內嵌文檔(%magic),iPython 當然不會在這方
面有所缺失。下面介紹些常用的magic 函式,如:
%bg function
把function 放到後台執行,例如:%bg myfunc(x, y, z=1),之後可以用jobs 將其結
果取回,myvar = jobs.result(5)或myvar = jobs[5].result。另外,jobs.status()
可以查看現有任務的狀態。
%ed 或 %edit
編輯一個檔案並執行,如果只編輯不執行,用 ed -x filename 即可。
%env
顯示環境變數
%hist 或 %history
顯示記錄
%macro name n1-n2 n3-n4 ... n5 .. n6 ...
建立一個名稱為 name 的宏,執行 name 就是執行 n1-n2 n3-n4 ... n5 .. n6 ... 這
些代碼。
%pwd
顯示目前的目錄
%pycat filename
用文法高亮顯示一個 Python 檔案(不用加.py 尾碼名)
%save filename n1-n2 n3-n4 ... n5 .. n6 ...
將執行過多代碼儲存為檔案
%time statement
計算一段代碼的執行時間
%timeit statement
自動選擇重複和迴圈次數計算一段代碼的執行時間,太方便了。
2. iPython 中用!表示執行shell 命令,用$將Python 的變數轉化成 Shell 變數。通過
這兩個符號,就可以做到和Shell 命令之間的互動,可以非常方便地做許多複雜的
工作。比如可以很方便地建立一組目錄:
for i in range(10):
s = "dir%s" % i
!mkdir $s
不過寫法上還是有一些限制,$ 後面只能跟變數名,不能直接寫複雜運算式,
$"dir%s"%i 就是錯誤的寫法了,所以要先完全產生 Python 的變數以後再用。例如:
for i in !ls:
print i
這樣的寫法也是錯的,可以這樣:
a = !ls
for i in a:
print i
還有一點需要說明,就是執行普通的 Shell 命令中如果有 $ 的話需要用兩個 $。比
如原來的echo $PATH 現在得寫成!echo $$PATH。
3. Tab 自動補全。iPython 一個非常強大的功能是tab 自動補全。標準Python 互動式解
釋器也可以tab 自動補全:
~$ python
Python 2.5.1 (r251:54863, Mar 7 2008, 04:10:12)
[GCC 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import rlcompleter, readline
>>> readline.parse_and_bind('tab: complete')
>>> h
hasattr hash help hex
標準Python 互動式解譯器和iPython 都支援“普通”自動補全和菜單補全。
使用自動補全,要先輸入一個匹配模型,然後按Tab 鍵。如果是“普通”自動補全
模式(預設),按Tab 鍵後會:
匹配模型按最大匹配展開;
列出所有匹配的結果。
例如:
In [1]: import os
In [2]: os.po
os.popen os.popen2 os.popen3 os.popen4
In [2]: os.popen
輸入os.po 然後按Tab 鍵,os.po 被展開成os.popen(就像在In [2]:提示符顯示的那樣),
並顯示os 所有以po 開頭的模組、類和函式,它們是popen、popen2、popen3 和popen4。
而菜單補全稍有不同。關閉預設Tab 補全,使用菜單補全,需修改設定檔
$HOME/.ipython/ipythonrc。
注釋掉:
readline_parse_and_bind tab: complete
取消注釋:
readline_parse_and_bind tab: menu-complete
不同於“普通”自動補全的顯示,當前命令所有匹配列表的菜單補全會隨著每按一
次Tab 鍵而迴圈顯示匹配列表中的項目。例如:
In [1]: import os
In [2]: os.po
結果是:
In [3]: os.popen
接下來每次按Tab 鍵就會迴圈顯示匹配列表中的其他項目:popen2、popen3、popen4,
最後回到po。菜單補全模式下查看所有匹配列表的快速鍵是Ctrl+L。
5. 曆史。當在iPython shell 下互動地輸入了大量命令、語句等,就像這樣:
In [1]: a = 1
In [2]: b = 2
In [3]: c = 3
In [4]: d = {}
In [5]: e = []
In [6]: for i in range(20):
...: e.append(i)
...: d[i] = b
...:
可以輸入命令“hist”快速查看那些已輸入的記錄:
In [7]: hist
1: a = 1
2: b =2
3: c = 3
4: d = {}
5: e = []
6:
for i in range(20):
e.append(i)
d[i] = b
7: _ip.magic("hist ")
要去掉記錄中的序號(這裡是1 至7),可使用命令“hist -n”:
In [8]: hist -n
a = 1
b =2
c = 3
d = {}
e = []
for i in range(20):
e.append(i)
d[i] = b
_ip.magic("hist ")
_ip.magic("hist -n")
這樣就可方便地將代碼複製到一個文字編輯器中。要在記錄中搜尋,可以先輸
入一個匹配模型,然後按Ctrl+P 鍵。找到一個匹配後,繼續按Ctrl+P 鍵就會向後搜
索再上一個匹配,按Ctrl+N 鍵則是向前搜尋最近的匹配。
6. 編輯。如果想在Python 提示符下實驗一個想法,經常要通過編輯器修改原始碼(甚
至是反覆修改)。在iPython 下輸入edit 就會根據環境變數$ EDITOR 調用相應的編
輯器。如果$EDITOR 為空白,則會調用vi(Unix)或記事本(Windows)。要回到iPython
提示符,直接退出編輯器即可。如果是儲存並退出編輯器,輸入編輯器的代碼會在
當前名字空間下被自動執行。如果不想這樣,可使用edit+X。如果要再次編輯上次
最後編輯的代碼,使用edit+P。在上一個特性裡,提到使用hist−n 可以很容易地將
代碼拷貝到編輯器。一個更簡單的方法是edit 加Python 列表的切片(slice)文法。
假定hist 輸出如下:
In [29]: hist
1 : a = 1
2 : b = 2
3 : c = 3
4 : d = {}
5 : e = []
6 :
for i in range(20):
e.append(i)
d[i] = b
7 : %hist
現在要將第4、5、6 句代碼匯出到編輯器,只要輸入:
edit 4:7
7. Debugger 介面。iPython 的另一特性是它與Python debugger 的介面。在iPython Shell
下輸入magic 關鍵字pdb 就會在產生一個異常時開關自動debugging 功能。在pdb
自動呼叫啟用的情況下,當Python 遇到一個未處理的異常時Python debugger 就會自
動啟動。debugger 中的當前行就是異常發生的那一行。iPython 的作者說有時候當他
需要在某行代碼處debug 時,他會在開始debug 的地方放一個運算式1/0。啟用pdb,
在iPython 中運行代碼。當解譯器處理到1/0 那一行時, 就會產生一個
ZeroDivisionError 異常,然後它就從指定的代碼處被帶到一個debugging session 中了。
8. 運行。有時候在一個互動式Shell 中,如果可以運行某個源檔案中的內容將會很有用。
運行magic 關鍵字run 帶一個源檔案名稱就可以在iPython 解譯器中運行一個檔案了(例
如run <源檔案> <運行源檔案所需參數>)。參數主要有以下這些:
-n 阻止運行源檔案代碼時{{{__name__}}}變數被設為"{{{__main__}}}"。這會
防止if {{{__name__}}} == "{{{__main__}}}":塊中的代碼被執行。
-i 源檔案在當前iPython 的名字空間下運行而不是在一個新的名字空間中。如果
你需要原始碼可以使用在互動式session 中定義的變數,它會很有用。
-p 使用Python 的profiler 模組運行並分析原始碼。使用該選項的代碼不會運行
在當前名字空間。
9. 宏。宏允許使用者為一段代碼定義一個名字,這樣可在以後使用這個名字來運行這段
代碼。就像在magic 關鍵字edit 中提到的,列表切片法也適用於宏定義。假設有一
個記錄如下:
In [3]: hist
1: l = []
2:
for i in l:
print i
可以這樣來定義一個宏:
In [4]: macro print_l 2
Macro `print_l` created. To execute, type its name (without quotes).
Macro contents:
for i in l:
print i
運行宏:
In [5]: print_l
------> print_l()
在這裡,列表l 是空的,所以沒有東西被輸出。但這其實是一個很強大的功能,賦予
列表l 某些實際值,再次運行宏就會看到不同的結果:
In [7]: l = range(5)
In [8]: print_l
------> print_l()
0
1
2
3
4
當運行一個宏時就好像你重新輸入了一遍包含在宏print_l 中的代碼。它還可以使用
新定義的變數l。由於Python 文法中沒有宏結構(也許永遠也不會有),在一個互動
式shell 中它更顯得是一個有用的特性。
10. 環境(Profiles)。就像早先提到的那樣,iPython 安裝了多個設定檔用於不同的環
境。設定檔的命名規則是ipythonrc-。要使用特定的配置啟動iPython,需要這樣:
ipython –p
一個建立自己環境的方法是在$HOME/.ipython 目錄下建立一個iPython 設定檔,
名字就叫做ipythonrc-,這裡是你想要的環境名字。如果同時進行好幾個項目,而這
些項目又用到互不相同的特殊的庫,這時候每個項目都有自己的環境就很有用了。
也可以為每個項目建立一個設定檔,然後在每個設定檔中import 該項目中經常
用到的模組。
11. 使用作業系統的Shell。使用預設的iPython 設定檔,有幾個Unix Shell 命令(當然,
是在Unix 系統上),cd、pwd 和ls 都能像在bash 下一樣工作。運行其他的shell 命
令需要在命令前加!或!!。使用magic 關鍵字%sc 和%sx 可以捕捉shell 命令的輸出。
pysh 環境可以被用來替換掉shell。使用-p pysh 參數啟動的iPython,可以接受並執
行使用者$PATH 中的所有命令,同時還可以使用所有的Python 模組、Python 關鍵字和
內建函式。
例如,想要建立500 個目錄,命名規則是從d_0_d 到d_499_d,可以使用
-p pysh 啟動iPython,然後就像這樣:
[~/ttt]|1> for i in range(500):
|.> mkdir d_${i}_d
|.>
這就會建立500 個目錄:
[~/ttt]|2> ls -d d* | wc -l
500
注意這裡混合了Python 的range 函式和Unix 的mkdir 命令。雖然ipython -p pysh 提
供了一個強大的shell 替代品,但它缺少正確的job 控制。在運行某個很耗時的任務
時按下Ctrl+Z 鍵將會停止iPython session 而不是那個子進程。
最後,退出iPython。可輸入Ctrl+D 鍵(會要求你確認),也可以輸入Exit 或Quit(注
意大小寫)退出而無須確認。
小結
經過本文對iPython 的特性及其基本使用方法的介紹,已經充分感受到iPython 的強大功
能了吧!那麼,就把它作為一個有利的工具協助我們開發吧!對於進一步的配置和更多
的用途,有興趣的讀者可以在以下網路上發掘更豐富的資料。
iPython 網站:http://ipython.scipy.org
iPython 英文文檔:http://ipython.scipy.org/moin/Documentation
精巧地址:http://bit.ly/GdPZU
iPython 中一些magic 函式:http://guyingbo.javaeye.com/blog/111142
精巧地址:http://bit.ly/3GVxE8
Ipython很強大,特性也很多,但是我根本記不住,常用的特性記錄下:
A
自動補全功能
需要單獨安裝pyreadline模組,
http://launchpad.net/pyreadline/1.6/1.6.1/+download/pyreadline-1.6.1.win32.exe
安裝後進入Ipython互動命令列後執行下面代碼後方可用,標準python命令列也是如此 :
>>>import readline,rlcompleter
>>>readline.parse_and_bind(‘tab complete’)
B 方便的?
?moudle 可以查看 模組的說明,顯示的比dir好看
C 曆史
hist可以查看到輸入命令的曆史
hist -n 去掉曆史前面的行數
按Ctrl+p 可以快捷輸入上次輸入的命令,如果再按之前輸入一個匹配項,則會匹配曆史命令,然後輸入
D快速編輯
hist查出來的語句可以通過 edit [x:y]來快速插入到 預設的文字編輯器裡,很是方便
E執行系統命令
!command可以執行 系統的命令,並返回例如:
!whoami
python中的變數需要在前面加上$,才能在shell命令中使用
F magic關鍵字
輸入magic可以看到詳細說明,ipython定義了一些常見的命令,執行使用者輸入的時候,會先判斷 是否為magic關鍵字,如果是,他直接就處理了 。edit就是一個magic keyword
G 運行源碼
run pyname.py [-arg]
* -n 阻止運行源檔案代碼時__name__變數被設為”__main__”。這會防止
if __name__ == “__main__”:
塊中的代碼被執行
* -i 源檔案在就當前IPython的名字空間下運行而不是在一個新的名字空間中。如果你需要原始碼可以使用在互動式session中定義的變數就會很有用。
* -p 使用Python的profiler模組運行並分析原始碼。使用該選項代碼不會運行在當前名字空間。