原文:http://kochiya.me/www/posts/Ipython!.html
前幾天偶然在公司內網上拖了一本 Learning IPython for Interactive Computing and Data Visualizatio,如名字所說,這本書主體內容就是討論ipython的使用與數據的可視化。由於很薄,昨天為了打發時間就隨便翻了翻,閱讀完了前三章,認識到一個問題:我從來沒有真正使用過ipython —- 之前只是很單純地把ipython看作一個支持自動補全和縮進的交互shell,直到真正閱讀了ipython的文檔,才發現這樣的認知相當無禮。
這篇筆記基本是以上文所提及到的書前兩章和官方文案為主要參考資料,如果希望更深入學習,請務必參看。官方文案附於此:文檔,書的話,我沒有搜索過,不過應該是有pdf版本流於網上的,如果實在找不到的話,我也可以上傳一份。
本文不會涉及到安裝步驟,並且也假設讀者理解特定術語(比如內省,profile)的意義。
初步
一旦您進入了ipython,ipython會提示您鍵入下面四個命令之一去試着使用ipython:
命令名 | 說明 |
---|---|
? | ipython特性的介紹和概述 |
%quickref | 一份手冊,包含了所有的命令 |
help | python的幫助系統 |
object? | 關於object的詳細信息,如果鍵入object??會更詳細 |
Ok,我們從這里開始,當然,首先是推薦您看一下quickref的。您注意到了,這個命令以%開頭。所有以%開頭的方法,都是所謂的魔術方法(Magic function),也就是ipython內置的一些方法。需要注意的是,魔術方法有%和%%之分,比如%timeit
和%%timeit
。這玩意在ipython中有專門的叫法,前者叫line magic
后者叫cell magic
。顧名思義,前者是專門針對一行的命令,后者針對多行的命令(這是notebook中的術語,關於notebook請參閱最后),如是而已。
所有的魔術方法都可以查看源碼,仔細閱讀的話,對自己寫代碼也很有裨益,具體方法是在魔術方法后面加??
,譬如%timeit??
。代碼是經過高亮和格式化的,應該很容易閱讀才是。如果您有着奇妙的好奇心的話,想必剛才也嘗試過%timeit?
。區別是,這次沒有源碼出現對吧。但是其他信息,比如type什么的指導性內容會顯示出來。
魔術方法會在下文專門一節來討論,這里有個印象即可。
接下來說說?
。
?其實上面已經有所涉及,總之您知道了可以用?修飾魔術方法獲取更詳細的信息。但是不只是這樣,?其實是可以修飾python所有的對象。考慮到python中一切都是對象,所以您知道了,?事實上可以查看一切的變量(這里強調了是變量了,所以 1? 這樣為什么會報錯……恩哼?)。
嘗試一下輸入下面的代碼,您會有更深入的了解。
In [1]: a = [1,2,3,4] In [2]: a? In [3]: list? In [4]: import os In [5]: os? In [6]: os.open? In [7]: super?
以上分別代表了變量,類,包,類中方法,內置函數,如您所見,均工作良好。把?
替換為??
,一般來說會得到更詳盡的信息,,不過?
通常就夠了(對我而言)。另外,?
其實作為前綴和作為后綴效果是相同的,只不過我更習慣放在后面而已。
上面的內容就是ipython最基礎的部分,請務必熟悉。
魔術方法
ipython一個很(最)重要特性就是魔術方法,不過內置的魔術方法實在太多了點(試試使用%lsmagic
看所有的魔術方法),這篇筆記當然不可能詳述所有的魔術方法,這里會挑一些常用的來說,權作拋磚引玉。
pwd
如果您仔細看過前文,您會發現這個命令沒有%,但是這個確實也是一個魔術方法,原因是,其實pwd這個命令只是一個鏈接,指向的是%pwd方法,%pwd指向系統的命令。當然這個命令含義很明顯,就是打印當前路徑。ipython把一些linux下常用的bash命令做了類似的處理,使用起來相當方便。我試了一下,大致有pwd,cd,whos,history,rm,ll,ls,mv,cp,alias,mkdir
。
!xxx
ipython雖然對不少常用命令做了封裝,但是畢竟不會很多,比如突然希望執行vim
或者top
之類的linux命令,難道還需要切出去不成?其實不需要,因為ipython提供了一個額外的!
語法去直接執行linux命令。比如,我需要執行top命令,那么在ipython中,只要這么寫就好!top
。
更復雜的linux命令也是支持的,事實上,只要加上!
,您完全可以把ipython當作bash來用。
而且,還可以賦值,比如這樣:
files = !ls -1 -S | grep hello
%edit
編輯器在ipython下使用得如此頻繁,以至於ipython專門有一個%edit方法。
不過默認效果估計會讓您失望,因為沒有指定的話,linux下默認會使用vi當作編輯器,windows下是notepad++(似乎?)。如果希望%edit打開自己喜愛的編輯器的話,需要在PATH中增加EDITOR項。
%run
ipython一般的使用,通常只是為了測試一行或者幾行代碼是否能夠執行。究其原因,還是因為命令行中書寫長代碼相較於在文件中寫代碼並不方便,一方面是格式,另一方面是在命令行中寫代碼,一旦中間代碼寫錯,修改起來還是很麻煩的。於是我們不得不一次次退出ipython,去python xxx.py
執行。或者tmux開兩個窗口來測試。
但是其實ipython已經提供了很方便的機制用來執行一個腳本,就是%run命令,%run可以簡化為run。
使用起來類似於熟悉的python test.py
,使用run test.py
就好。run命令還可以附加選項,常用的有-t
選項,這個會在腳本執行完后,打印出執行的cpu timings。如果指定了-t
選項,后面可以跟一個-Nx
,x代表一個數字。表示重復執行x次。
另外比較好用的是-d
選項,這個會在pdb中運行腳本。后跟-bxx
打斷點。個人沒有什么python調試的經驗,您有興趣可以親自嘗試。
還有一個-p
選項,這個選項會開啟python profiler,從而打印出詳細的執行時間、函數調用等等信息供優化參考。
%timeit
這個命令用來測試一條命令執行的時間,一般而且,會重復100次運行這個命令,然后取出最好的3個結果取平均值。
試着執行下面的命令:
In[1]: %timeit [x*x for x in range(100000)]
同樣,可以指定選項。
-n
指定重復次數,默認100
-r
是取多少個結果的平均值,默認是3
順帶一提,%timeit測出來的結果遠比真實運行更快,原因是,timeit執行中,會暫時關閉掉垃圾回收(gc)。
shell中使用python變量
其實這個不算是魔術方法啦,只是單獨列出來也不太合適,所以也就寫在這里。
請看下面這段代碼:
folder = 'data' mkdir $folder cd %folder
注意到了么,mkdir是一個魔術方法,它是%mkdir的一個鏈接,%mkdir事實上就是shell中的mkdir方法。而folder是一個python變量。但是,確實,shell下的命令訪問了python的變量,只是在變量名前面加了$
。如果您熟悉shell腳本的話,這種方式應該很親切才對。
%bookmark
這個方法通常用來記憶路徑,譬如說,您每次都需要cd進一個叫做github/miko/loli/shoujo
的目錄,這時候,您可以對這個路徑做一個書簽,%bookmark shoujo github/miko/loli/shoujo
,這樣以后就可以直接cd shoujo
這樣。
順便,如果沒有指定路徑,會默認使用當前路徑。
%alias
正如名字揭示的,這個方法用來指定別名。不過,ipython的%alias還能進行參數傳遞。
看看下面這段:
In [1]: %alias largest ls -1sSh | grep %s In [2]: largest circles
很容易懂不是么?%alias后面跟的那個參數就是別名,然后可以通過%s來指定一個參數,使用時傳入。
%store
默認的,別名只會存在於本次會話中,如果希望下次還能使用這個別名,使用%store方法存下來吧。%store latest
另外,沒保存也不要緊,%store -r
會恢復上次會話的別名。
%hist
ipython中history會保存所有會話中的記錄,嘛,所以隔一年什么的記錄就會相當多啦。
雖然我知道你們都會用up,down來尋找歷史記錄……恩,試試ctrl+r
,有驚喜。
另外,類似於hist 3-7
什么的,好像也不用我解釋就是了。
-g
選項和grep類似,可以查找些東西出來,然后-n
顯示行號,-f
保存歷史記錄到文件中去,-p
把行號顯示為n:>>>
,-n
把輸入的結果顯示出來(我猜沒多少用這些個……
內省
最開始就解釋過?
和??
了,如果對python比較熟悉的話,會意識到這其實就是內省。
后面這里有幾個大概不會用到的方法……
%psource,%pfile,%pdoc,%pdef
其實就是把?的結果進行了摘錄……額,有人會用么?
notebook
ipython中最讓人驚艷(我覺得)的就是這個notebook功能,不過要啟用這個,首先需要安裝pyZMQ
。然后執行ipython notebook
,嘿,您看見了什么。一個基於web的ipython shell!
notebook實際上會在本地的8888端口開一個服務器(tornado),您所見到的首頁,通常叫做notebook dashboard
,它會列出所有的notebook。
每個notebook文件都是一個叫做.ipynb的擴展文件格式,這是一個包含了json的文件。
文件包含了從交互會話中取得的輸入輸出,然后還有一些metadata以供ipython使用。
notebook中的代碼片段有個專門的術語叫做cell
,這里事先說明。
notebook使用起來和ipython差不多,不過修改起來方便得多,並且可以建多個notebook,所以使用起來各種方便。不過,需要聯網的庫應該是用不了的,我測試requests沒有成功……
執行一個cell使用ctrl+Enter
,執行並新建一個新的notebook使用shift+enter
,當然您去戳上面的按鈕也是可以的。
您可以通過鍵入ctrl+M 然后 H
來得知有那些鍵盤快捷鍵可以使用。
cell中當然也可以使用魔術方法,而且,由於notebook獨特的優勢,您可能需要測試多行代碼,這時候,請別忘記用%%
代替%
。
cell中有一個特殊的%%file
方法,可以創建一個文件,具體使用是這樣:
%%file nyanya.txt hello world this is nyanya over
很簡單不是么。
然后還有一個%%!
方法。這個方法可以執行一些bash命令。
最后,notebook還可以充當一個markdown編輯器……
finally
上面關於ipython已經說得足夠多了,如果您認真閱讀過,相信您也會驚訝:原來ipython能做到這么多事!如果能讓您產生這樣的想法,那就是我的榮幸。
不過畢竟只有這么多字,其實討論得還是不夠,更多的,您恐怕要在實際使用中才能知道一些漂亮的用法並且會記憶住更多的魔術方法。
但是您會慢慢熟練起來,並愛上它的,我相信。
謝謝您的閱讀。
以上。
去過動漫展並被坑得不輕躺在床上不想起來的AS。