1. 程式人生 > >史上最詳細、最完全的ipython使用教程,Python使用者必備!——ipython系列之二

史上最詳細、最完全的ipython使用教程,Python使用者必備!——ipython系列之二

宣告:本文承接前面一篇文章,ipython系列之一;另外,本文所指的ipython不是ipython notebook,ipython notebook已經被jupyter notebook所取代,不再叫ipython notebook了。

前面講解了ipython裡面的一些核心知識點,包括它的優勢所在、快捷鍵操作、內省、什麼是魔術命令等等,本文將在前文的基礎之上,進一步拓展,講解ipython的進階知識點。

一、ipython與matplotlib結合

關於matplotlib的強大之處,這裡不再說明,想要知道matplotlib的體系架構和繪圖方法,可以參見我的另外兩篇文章:

matplotlib高階教程之形狀與路徑——patches和path

一文詳解matplotlib的配置檔案以及配置方式

matplotlib教程之——自定義配置檔案和繪圖風格(rcParams和style)

matplotlib教程——matplotlib與tkinter的整合

我們先通過一個簡單的例子來說明,我需要使用ipython畫一個簡單圖形,如果直接開啟ipython,然後繪製,程式碼如下:

In [1]: import matplotlib.pyplot as plt

In [2]: x=[1,2,3,4,5]

In [3]: y=[2,4,6,8,10]

In [4]: plt.plot(x,y)
Out[4]: [<matplotlib.lines.Line2D at 0x24a6558e438>]

In [5]: plt.show()

然後會開啟下面的一個影象,如下:

但是,會出現一個問題,這個時候我如果想要繼續在ipython裡面輸入其他的語句或者是執行其他的命令,沒辦法執行了,這是因為matplotlib的GUI時間迴圈接管了ipython的控制權,只有關閉了GUI視窗,才能夠繼續進行操作。這種阻塞式的問題極大地影響了互動體驗,那怎麼辦呢?

我們不要直接啟動在選單中啟動ipython,而是通過輸入cmd命令,然後通過命令 ipython --pylab 這句話啟動ipython,通過新增引數--pylab就可以解決上面的阻塞問題了,現在當我們再次輸入上面的程式碼,發現及時GUI沒有關閉,我們依然可以在ipython中進行互動,這是非常方便的。

--pylab 引數有以下兩個方面的好處:

(1)ipython會預設啟動後臺的GUI,這樣就不需要plt.show()這一句話,在plot繪圖函式後面直接回車,就可以顯示圖片了

(2)GUI不會對ipython造成任何阻塞,不會影響互動

注意,我們還可以通過魔法命令%gui,選擇合適的畫圖後端引擎,一般格式為 %gui guiname,如下所示:

 %gui wx      # enable wxPython event loop integration
 %gui qt4|qt  # enable PyQt4 event loop integration
 %gui qt5     # enable PyQt5 event loop integration
 %gui gtk     # enable PyGTK event loop integration
 %gui gtk3    # enable Gtk3 event loop integration
 %gui tk      # enable Tk event loop integration
 %gui osx     # enable Cocoa event loop integration
                 # (requires %matplotlib 1.1)
 %gui         # disable all event loop integration

關於後端畫圖引擎,還有一個魔術命令 %matplotlib 可以使用,常見的如下:

%matplotlib   #顯示當前使用後端

Using matplotlib backend: TkAgg

 %matplotlib --list  或者是 -l   #顯示有哪些後端可以使用
 Available matplotlib backends: ['osx', 'qt4', 'qt5', 'gtk3', 'notebook', 'wx', 'qt', 'nbagg','gtk', 'tk', 'inline']

 %matplotlib inline   #這是在jupyter notebook中使用的,讓jupyter與matplotlib整合,這種情況下,預設使用的是TkAgg後端

但是上面的方式依然有一個問題,那就是ipython視窗與matplotlib視窗並沒有放在一起,雖然他們不再有阻塞,但是依然影響更加舒適的互動體驗,因為ipython程式是一個和使用者終端有點類似的黑色的窗體(實際上我們可以修改它的主題),如果能夠將matplotlib所化的圖形就放在ipython裡面多好,這樣就不會出現多個窗體程式了,我們有幾種方式實現:

(1)通過第三方的相關庫,是完全可以將matplotlib放在ipython裡面的,

(2)通過另一種形式——jupyter qtconsole來實現這樣的目的

二、jupyter qtconsole

jupyter qtconsole的前身叫做ipython qtconsole,同ipython notebook一樣,後面改成了jupyter,至於什麼是jupyter,下一篇文章會專門介紹到jupyter notebook的使用。

jupyter qtconsole 是ipython團隊基於qt框架開發的一個GUI控制檯,但是這個“控制檯”很特殊,它具有富文字編輯功能,既能夠在裡面實現內嵌圖片、多行編輯、語法高亮等這樣的“富文字功能”。關於qtconsole的安裝和啟動這些基礎知識,這裡就不在介紹了。

我們在qtconsole裡面輸入如下程式碼:會得到直接的一個結果如下所示:

我們發現,所化的影象直接就顯示在了qtconsole裡面,不需要我設定什麼其他的,這是多麼的人性化,這樣的功能對於編寫一個大型軟體,使用qtconsole進行小模組的測試和試驗,是特別有幫助的,這就是qtconsole的簡單強大之處。

現在可以回答什麼是qtconsole了。

它是一個具有選單富文字編輯的控制檯,ipython具有的功能(tab自動補全、語法高亮、內省、魔術命令等等),它都有,它是ipython的進一步改進版。

注意:上面的操作是基於新版本的jupyter qtconsole,它預設就已經將matplotlib整合到了qtconsole一起了,但是對於老版本的ipython qtconsole,並沒有,因此不能直接開啟ipython qtconsole,而是要在cmd中使用命令ipython qtconsole --pylab=inline 進行開啟才行。

三、命令歷史記錄與輸入輸出

1、所謂的命令歷史主要是上一篇文章中已經講到的兩個快捷鍵的使用,即Ctrl+P和Ctrl+N。還可以使用%hist魔術方法。

2、所謂的輸入與輸出主要是使用 _、__、_X、_iX,這裡的X表示行號,在前面也已經講過,這裡就不重複了。

四、ipython與作業系統進行互動

ipython與作業系統的shell是聯絡的非常緊密的,我們可以直接在ipython中就實現在作業系統的shell中所做的事情,包括執行shell命令、更改目錄、為shell提供別名、建立目錄書籤、將shell執行的結果儲存在python的物件中 等等操作,下面進行一些常見的例項。

1、!cmd :在ipython中開啟系統的cmd。這就相當於現在ipython已經變成了系統自帶的cmd,若要回到ipython介面,可以再輸入ipython,這就相當於在cmd中啟動ipython

2、%pwd :返回當前ipython的工作目錄

    %cd newdirectory: 進入新的工作目錄

    %dhist  :列印目錄訪問的歷史

    %env :以dict的形式返回系統的環境變數

如下:

In [1]: %pwd
Out[1]: 'D:\\ProgramData\\Anaconda3\\envs\\tensorflow\\Scripts'

In [2]: %cd C:\Users\XinAir\Desktop
C:\Users\XinAir\Desktop

In [3]: %dhist
Directory history (kept in _dh)
0: D:\ProgramData\Anaconda3\envs\tensorflow\Scripts
1: C:\Users\XinAir\Desktop

注意:所謂的ipython與系統自帶的shell是整合的,主要是體現在兩個方面:

(1):我可以在ipython裡面用魔術命令的方式達到在shell中執行系統命令的效果,比如上面的例子,返回當前的工作目錄,進入新的從做目錄等操作,這些操作本來是在shell中完成,但是我在ipython中通過魔術命令依然可以完成。

(2)在ipython中我也可以直接使用系統shell的命令,只不過需要在原來的shell命令前面加上一個感嘆號!,這就是為什麼

!cmd 就會開啟系統shell的原因了,比如我可以在ipython中檢視本機的IP地址,執行 !ipconfig。因為window系統中檢視IP地址的shell命令就是ipconfig,在ipython中只需要在系統shell命令前面加上一個感嘆號!就可以了。

再比如,我們都知道在windows下面,執行shell命令notepad會開啟一個記事本,同樣,如果我們在ipython中輸入 

!notepad ,發現,也會開啟一個記事本。

這兩個方面的區別在於,第一種方法是通過魔術方法完成,但是,並不是所有的系統shell命令都會有一個魔術方法與之對應,魔術方法只定義了一些常見的shell命令,但是第二種方法,只要使用 !shell_command均可以。

3、為系統的shell命令定義別名

根據上面的說法,也就說很多系統shell命令並沒有與之對應的魔術方法,那怎麼辦呢?我們可以給系統shell命令定義一個別名,然後在使用魔術方法實現。定義別名的方法為:

%alias  new_name shell_command

%alias是一個魔術方法 ,new_name是人為的起的別名,shell_command是系統的shell命令的名稱,比如我給系統shellnotepad定一個別名abcd,如下:

%alias abcd notepad

然後執行%abcd就可以開啟一個記事本了,如下:

In [4]: %alias abcd notepad

In [5]: %abcd

再舉個例子,在windows系統中,輸入shell命令 calc會開啟一個計算器應用程式,我們也可以在ipython中給它定義一個別名,如下:

In [8]: %alias xyz calc

In [9]: %xyz

這樣也會開啟一個計算器。

總結:ipython與系統shell互動的兩種方式如下所示:

4、使用ipython的目錄書籤系統

所謂的書籤系統就是,給經常使用的目錄起一個別名,以便實現快速跳轉。格式為:

%bookmark 書籤名 檔案目錄

其中%bookmark是魔術方法。

比如,我有一個常見的經常使用的目錄,D:\ProgramData\Anaconda3\envs\tensorflow\Scripts

要在ipython中進入這個目錄我可以這麼辦 %cd D:\ProgramData\Anaconda3\envs\tensorflow\Scripts,但是如果要經常進入這個目錄就很麻煩,因為需要輸入很多字母,現在我給他起一個書籤名,如下:

In [10]: %bookmark mydir D:\ProgramData\Anaconda3\envs\tensorflow\Scripts

In [11]: %cd mydir
(bookmark:mydir) -> D:\ProgramData\Anaconda3\envs\tensorflow\Scripts
D:\ProgramData\Anaconda3\envs\tensorflow\Scripts

由此可見這種方式對於經常使用的目錄,非常有幫助。

五、高階功能

ipython的功能當然遠遠不止於此,他還有更加高階的功能,包括日誌處理、程式碼除錯、效能分析、自定義主題顯示等等方面的問題,後面的文章會繼續分析跟進。