ipython使用


就象上面提到的,啟動IPython就是運行可執行文件ipython。你會看到一個提示符,如果你曾經玩過標准Python命令行提示符,你會發現這個有點兒不同:

[jjones@cerberus ~]$ /usr/local/python24/bin/ipython
Python 2.4 (#2, Nov 30 2004, 09:22:54)
Type "copyright", "credits" or "license" for more information.

IPython 0.6.6 -- An enhanced Interactive Python.
? -> Introduction to IPython's features.
%magic -> Information about IPython's 'magic' % functions.
help -> Python's own help system.
object? -> Details about 'object'. ?object also works, ?? prints more.

In [1]:

要退出IPython(Linux系統上)就輸入Ctrl-D(會要求你確認),也可以輸入Exit或Quit(注意大小寫)退出而不需要確認。

特性

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當然不會在這方面有所缺失。

Tab自動補全

IPython一個非常強大的功能是tab自動補全。如果你對Python很了解,可能會想,標准Python交互式解釋器也可以tab自動補全啊。你要做的只是:

[jjones@cerberus ~]$ /usr/local/python24/bin/python
Python 2.4 (#2, Nov 30 2004, 09:22:54)
[GCC 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import rlcompleter, readline
>>> readline.parse_and_bind('tab: complete')
>>>

是的,標准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:

In [2]: os.po
os.popen os.popen2 os.popen3 os.popen4
In [2]: os.po

自省

Python有幾個內置的函數用於自省。IPython不僅可以調用所有標准Python函數,對於那些Python shell內置函數同樣適用。典型的使用標准Python shell進行自省是使用內置的dir()函數:

>>> import SimpleXMLRPCServer
>>> dir(SimpleXMLRPCServer.SimpleXMLRPCServer)
['__doc__', '__init__', '__module__', '_dispatch',
'_marshaled_dispatch', 'address_family', 'allow_reuse_address',
'close_request', 'fileno', 'finish_request', 'get_request',
'handle_error', 'handle_request', 'process_request',
'register_function', 'register_instance',
'register_introspection_functions', 'register_multicall_functions',
'request_queue_size', 'serve_forever', 'server_activate', 'server_bind',
'server_close', 'socket_type', 'system_listMethods',
'system_methodHelp', 'system_methodSignature', 'system_multicall',
'verify_request']

嗯,非常棒。事實上非常實用。幾年來我一直這么做,對此非常滿意。這是一個漂亮的列表,包含了 SimpleXMLRPCServer.SimpleXMLRPCServer的所有方法,類,模塊等等。因為dir()是一個內置函數,在 IPython中也能很好的使用它們。但是IPython的操作符?和??功能還要強大:

In [1]: import SimpleXMLRPCServer

In [2]: ? SimpleXMLRPCServer.SimpleXMLRPCServer
Type: classobj
String Form: SimpleXMLRPCServer.SimpleXMLRPCServer
Namespace: Interactive
File: /usr/local/python24/lib/python2.4/SimpleXMLRPCServer.py
Docstring:
Simple XML-RPC server.

Simple XML-RPC server that allows functions and a single instance
to be installed to handle requests. The default implementation
attempts to dispatch XML-RPC calls to the functions or instance
installed in the server. Override the _dispatch method inherited
from SimpleXMLRPCDispatcher to change this behavior.

Constructor information:
Definition: SimpleXMLRPCServer.SimpleXMLRPCServer(self, addr,
requestHandler=, logRequests=1)

?操作符會截斷長的字符串。相反,??不會截斷長字符串,如果有源代碼的話還會以語法高亮形式顯示它們。

歷史

當你在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
...:

你可以快速查看那些輸入的歷史記錄:

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

要去掉歷史記錄中的序號(這里是1至6),使用命令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

這樣你就可以方便的將代碼復制到一個文本編輯器中。要在歷史記錄中搜索,可以先輸入一個匹配模型,然后按Ctrl-P。找到一個匹配后,繼續按Ctrl-P會向后搜索再上一個匹配,Ctrl-N則是向前搜索最近的匹配。

編輯

當在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

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中了

運行

有時候當你在一個交互式shell中時,如果可以運行某個源文件中的內容將會很有用。運行magic關鍵字run帶一個源文件名就可以在IPython解釋器中運行一個文件了(例如run <源文件> <運行源文件所需參數>)。參數主要有以下這些:

* -n 阻止運行源文件代碼時__name__變量被設為"__main__"。這會防止
if __name__ == "__main__":
塊中的代碼被執行

* -i 源文件就在當前IPython的名字空間下運行而不是在一個新的名字空間中。如果你需要源代碼可以使用在交互式session中定義的變量就會很有用。

* -p 使用Python的profiler模塊運行並分析源代碼。使用該選項代碼不會運行在當前名字空間。




宏允許用戶為一段代碼定義一個名字,這樣你可以在以后使用這個名字來運行這段代碼。就象在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
Out[5]: Executing Macro...

在這里,列表l是空的,所以沒有東西被輸出。但這其實是一個很強大的功能,我們可以賦予列表l某些實際值,再次運行宏就會看到不同的結果:

In [6]: l = range(5)

In [7]: print_l
Out[7]: Executing Macro...
0
1
2
3
4

當運行一個宏時就好象你重新輸入了一遍包含在宏print_1中的代碼。它還可以使用新定義的變量l。由於Python語法中沒有宏結構(也許永遠也不會有),在一個交互式shell中它更顯得是一個有用的特性。

環境(Profiles)

就象早前提到的那樣,IPython安裝了多個配置文件用於不同的環境。配置文件的命名規則是ipythonrc-。要使用特定的配置啟動IPython,需要這樣:

ipython -p

一個創建你自己環境的方法是在$HOME/.ipython目錄下創建一個IPython配置文件,名字就叫做ipythonrc_,這里是你想要的環境的名字。如果你同時進行好幾個項目,而這些項目又用到互不相同的特殊的庫,這時候每個項目都有自己的環境就很有用了。你可以為每個項目建立一個配置文件,然后在每個配置文件中import該項目中經常用到的模塊。

使用操作系統的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_500_d(譯注:呵呵,作者這里犯了個小小的計算錯誤,你能看出來嗎),我可以使用-p pysh啟動IPython,然后就象這樣:

jjones@cerberus[foo]|2> for i in range(500):
|.> mkdir d_${i}_d
|.>

這就會創建500個目錄:

jjones@cerberus[foo]|8> ls -d d* | wc -l
500

注意這里混合了Python的range函數和Unix的mkdir命令。

注意,雖然ipython -p pysh提供了一個強大的shell替代品,但它缺少正確的job控制。在運行某個很耗時的任務時按下Ctrl-z將會停止IPython session而不是那個子進程。

問題和方法

雖然作為標准Python shell的替換,IPython總的來說很完美。還是有兩個問題給我帶來了一些麻煩。感謝IPython的開發者,這兩個問題都可以通過配置來解決,每個配置都有清晰的文檔。

第一個問題是關於顏色的。在我的一個系統上,我使用的是一個白色背景的xterm。當我使用?和??查詢一個對象或模塊的信息時,對象的定義會被顯示,但看起來好象那些參數丟失了。那是因為在構造函數中的的參數默認顯示為白色。我的解決辦法是在IPython shell中輸入colors LightBG。

第二個問題是關於自動縮進和代碼粘貼的。如果autoindent被啟用,IPython會對我粘貼的已排好縮進的代碼再次應用縮進。例如下面的代碼:

for i in range(10):
for j in range(10):
for k in range(10):
pass

會變成:

for i in range(10):
for j in range(10):
for k in range(10):
pass

在這里它並不是個問題,因為在它自身中縮進都保持一致。在其它一些情況下(例子一下子舉不出來了),可能會成為真正的問題。可以使用magic關鍵字autoindent來開關自動縮進,告訴IPython不要添加多余的縮進──就象在vim中設置粘貼set paste一樣。

結論

IPython 並不是囗囗性的,也不是完全創新的。Tab自動補全,歷史記錄搜索,配置環境,配置文件等都早已在其它shells中存在有些年頭了。Python擁有各種級別的自省能力也有一段時間了。但IPython把來自成熟的Unix shell,標准Python shell以及Python語言中的一些最強大的功能整合到了一起。產生出了一個強大的令人難以置信的性能增強工具,我想我會很樂意在接下來的幾年中一直使用它。套用阿基米德的話來說,給我一個強大而又靈活的文本編輯器(vim),一個交互式shell(IPython)以及一個語言(Python),我就能撬動整個世界


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM