天天看點

ipython 正确的打開方式

  python 的優點之一是互動式解釋器;事實上,Ipython內建互動式python的諸多優點。ipython具有卓越的python shell,其性能遠遠優于标準python 的shell!!!

  之前我隻知道ipython可以tab 補全、查module的用法、dir、help、使用了這麼久,現在終于知道了點皮毛,下面介紹如何使用ipython提高*nix-shell以及python相關任務的執行效率【開始扒皮了】

一、基礎使用

 1、魔力函數(built-in)[以前我并不知道這是什麼東西,也就是ipython的内置的一些方法]

   IPython 會将任何第一個字母為%的行,視為對魔力函數的特殊調用。這樣你就可以控制ipython,為其增加許多系統級的特征。魔力函數都是以%為字首,并且參數中不包含括号或者引号。

1

2

3

4

5

6

7

8

9

10

11

<code>檢視可用的magic</code>

<code> </code> 

<code>In [46]: %lsmagic</code>

<code>Out[46]: </code>

<code>Available line magics:</code>

<code>%</code><code>alias</code>  <code>%alias_magic  %autocall  %autoindent  %automagic  %bookmark  %</code><code>cat</code>  <code>%</code><code>cd</code>  <code>%</code><code>clear</code>  <code>%colors  %config  %</code><code>cp</code>  <code>%cpaste  %debug  %dhist  %</code><code>dirs</code>  <code>%doctest_mode  %ed  %edit  %</code><code>env</code>  <code>%gui  %hist  %</code><code>history</code>  <code>%install_default_config  %install_ext  %install_profiles  %killbgscripts  %ldir  %</code><code>less</code>  <code>%lf  %lk  %ll  %load  %load_ext  %loadpy  %logoff  %logon  %logstart  %logstate  %logstop  %</code><code>ls</code>  <code>%lsmagic  %lx  %macro  %magic  %</code><code>man</code>  <code>%matplotlib  %</code><code>mkdir</code>  <code>%</code><code>more</code>  <code>%</code><code>mv</code>  <code>%notebook  %page  %</code><code>paste</code>  <code>%pastebin  %pdb  %pdef  %pdoc  %pfile  %pinfo  %pinfo2  %</code><code>popd</code>  <code>%pprint  %precision  %profile  %prun  %psearch  %psource  %</code><code>pushd</code>  <code>%</code><code>pwd</code>  <code>%pycat  %pylab  %quickref  %recall  %rehashx  %reload_ext  %rep  %rerun  %reset  %reset_selective  %</code><code>rm</code>  <code>%</code><code>rmdir</code>  <code>%run  %save  %sc  %set_env  %store  %sx  %system  %tb  %</code><code>time</code>  <code>%timeit  %</code><code>unalias</code>  <code>%unload_ext  %</code><code>who</code>  <code>%who_ls  %whos  %xdel  %xmode</code>

<code>Available cell magics:</code>

<code>%%!  %%HTML  %%SVG  %%</code><code>bash</code>  <code>%%capture  %%debug  %%</code><code>file</code>  <code>%%html  %%javascript  %%latex  %%perl  %%prun  %%pypy  %%python  %%python2  %%python3  %%ruby  %%script  %%sh  %%svg  %%sx  %%system  %%</code><code>time</code>  <code>%%timeit  %%writefile</code>

<code>Automagic is ON, % prefix IS NOT needed </code><code>for</code> <code>line magics.</code>

  魔力【魔術】函數 ,它們分為兩類%%與%,比如%time,%%time,%表示專門針對一行的指令,%%表示針對多行的指令

值的一說的是:%quickref 它就是ipython中魔術函數的手冊,它己經為你總結出每一個 magic func 的用法

 2、?與??

    ?:修飾魔術方法擷取更詳細的資訊。但是不隻是這樣,?其實是可以修飾python所有的對象。考慮到python中一切都是對象,是以你懂的

   ??:可以用于檢視變量,類、包、類中方法、内置函數的源碼。

 3、 !xxx

ipython提供了一個額外的!文法去直接執行linux指令;

使用$可以将變量傳遞到shell指令中;

!!可以替換!,除了使用!!無法儲存結果到變量之外,兩者完全相同.

<code>In [50]: user=</code><code>'sysadmin'</code>

<code>In [51]: process=</code><code>'bash'</code>

<code>In [52]: l=!</code><code>ps</code> <code>aux |</code><code>grep</code> <code>$user |</code><code>grep</code> <code>$process</code>

<code>In [53]: l</code>

<code>Out[53]: </code>

<code>[</code><code>'root     18119  0.0  0.0 106096  1144 pts/8    S+   14:00   0:00 /bin/sh -c ps aux |grep sysadmin |grep bash'</code><code>,</code>

<code> </code><code>'sysadmin 24270  0.0  0.0 108340  1848 pts/0    Ss   09:36   0:00 -bash'</code><code>,</code>

<code> </code><code>'sysadmin 27048  0.0  0.0 108476  1860 pts/7    Ss   10:06   0:00 -bash'</code><code>]</code>

 4、%run

   有了它之後,就可以不用退出ipython而運作*.py;

   常用的選項:

     -t:列印出cpu timings

     -N#:表示重複次數

     -p:這個選項會開啟python profiler,進而列印出詳細的執行時間、函數調用等等資訊供優化參考。

     -d:會進入單步調試模式(ipdb),可以看到程式内部執行流程 

12

13

14

15

16

17

18

19

<code>In [108]: %run -tp temp.py</code>

<code>Space used </code><code>in</code> <code>/tmp</code> <code>directory</code>

<code>8.0K    </code><code>/tmp/ipython_edit_MrCrjh</code>

<code>4.0K    </code><code>/tmp/</code><code>.ICE-unix</code>

<code>8.0K    </code><code>/tmp/ipython_edit_k8BYnO</code>

<code>...</code>

<code>         </code><code>82 </code><code>function</code> <code>calls </code><code>in</code> <code>0.027 seconds</code>

<code>   </code><code>Ordered by: internal </code><code>time</code>

<code>   </code><code>ncalls  tottime  percall  cumtime  percall filename:lineno(</code><code>function</code><code>)</code>

<code>        </code><code>1    0.010    0.010    0.010    0.010 {posix.fork}</code>

<code>        </code><code>1    0.007    0.007    0.007    0.007 {posix.</code><code>read</code><code>}</code>

<code>        </code><code>1    0.005    0.005    0.005    0.005 {posix.waitpid}</code>

<code>        </code><code>1    0.001    0.001    0.019    0.019 subprocess.py:1111(_execute_child)</code>

<code>        </code><code>1    0.001    0.001    0.026    0.026 {execfile}</code>

<code>        </code><code>1    0.000    0.000    0.027    0.027 interactiveshell.py:2616(safe_execfile)</code>

<code>        </code><code>4    0.000    0.000    0.000    0.000 {fcntl.fcntl}</code>

<code>        </code><code>1    0.000    0.000    0.025    0.025 subprocess.py:485(call)</code>

 5、alias

   能夠銜接python與UNIX shell功能的第一個特征就是alias魔術函數

<code>In [24]: </code><code>alias</code> <code>nss </code><code>netstat</code> <code>-talp</code>

<code>In [25]: nss |</code><code>grep</code> <code>http</code>

<code>tcp        0      0 *:http                      *:*                         LISTEN      22902</code><code>/nginx</code>

   當然了,這都是常用的功能,還有另一種功能“格式化替換”

<code>In [42]: </code><code>alias</code> <code>nss </code><code>netstat</code> <code>%l |</code><code>grep</code> <code>:6011</code>

<code>In [43]: nss -talp</code>

<code>tcp        0      0 localhost:6011              *:*                         LISTEN      27047</code><code>/sshd</code>          

<code>tcp        0      0 localhost:6011              *:*                         LISTEN      27047</code><code>/sshd</code>

   這是的%l(字母l)該方法用于将行的其它部分插入到alias中,還可以通過指令字任串插入不同的參數,用%s表示字元串

<code>In [44]: </code><code>alias</code> <code>aecho </code><code>echo</code> <code>firt </code><code>"#%s#"</code><code>,second </code><code>"#%s#"</code>

<code>In [45]: </code>

<code>In [45]: aecho JACK pam</code>

<code>firt </code><code>#JACK#,second #pam#</code>

  如果輸入的參數少于需要的參數則會報錯,但多餘需要的參數則不會【23333..】

 6、 %store

   可以使用他保留所使用的别名,下次打開ipython就可以直接使用了

<code>In [46]: %store nss</code>

<code>Alias stored: nss (</code><code>netstat</code> <code>%l |</code><code>grep</code> <code>:6011)</code>

    注:這需要SQLite的支援,否則打開新的會話将無法使用别名 

二、進階用法

   1、字元串處理

      ipython 另一個強大的功能是采用字元串方式處理系統 shell指令執行結果

<code>In [8]: </code><code>ps</code> <code>=!</code><code>ps</code> <code>-aux </code>

<code>In [9]: </code><code>ps</code><code>.</code>

<code>ps</code><code>.append     </code><code>ps</code><code>.fields     </code><code>ps</code><code>.get_paths  </code><code>ps</code><code>.index      </code><code>ps</code><code>.list       </code><code>ps</code><code>.p          </code><code>ps</code><code>.remove     </code><code>ps</code><code>.</code><code>sort</code>

<code>ps</code><code>.count      </code><code>ps</code><code>.get_list   </code><code>ps</code><code>.get_spstr  </code><code>ps</code><code>.insert     </code><code>ps</code><code>.n          </code><code>ps</code><code>.paths      </code><code>ps</code><code>.reverse    </code><code>ps</code><code>.spstr</code>

<code>ps</code><code>.extend     </code><code>ps</code><code>.get_nlstr  </code><code>ps</code><code>.</code><code>grep</code>       <code>ps</code><code>.l          </code><code>ps</code><code>.nlstr      </code><code>ps</code><code>.pop        </code><code>ps</code><code>.s          </code>

<code>In [9]: </code><code>ps</code><code>.</code><code>grep</code><code>(</code><code>'ssh'</code><code>)</code>

<code>Out[9]: </code>

<code>[</code><code>'root      6854  0.0  0.0  66140   240 ?        Ss   Oct09   0:00 /usr/sbin/sshd'</code><code>,</code>

<code> </code><code>'root     21334  0.0  0.0 100348     8 ?        Ss   14:49   0:00 sshd: sysadmin [priv]'</code><code>,</code>

<code> </code><code>'sysadmin 21336  0.0  0.0 100496   356 ?        S    14:49   0:01 sshd: sysadmin@pts/3'</code><code>,</code>

<code> </code><code>'root     29347  0.0  0.2 100352  4304 ?        Ss   16:49   0:00 sshd: sysadmin [priv]'</code><code>,</code>

<code> </code><code>'sysadmin 29351  0.0  0.1 100760  2280 ?        S    16:49   0:00 sshd: sysadmin@pts/0'</code><code>,</code>

<code> </code><code>'root     30684  0.0  0.2 100352  4280 ?        Ss   17:08   0:00 sshd: sysadmin [priv]'</code><code>,</code>

<code> </code><code>'sysadmin 30739  0.0  0.0 100352  1884 ?        S    17:08   0:00 sshd: sysadmin@pts/4'</code><code>]</code>

 這裡面除了有清單的屬性還有一些其它附加的屬性

<code>In [20]: </code><code>ps</code><code>.</code><code>grep</code><code>(</code><code>'sshd'</code><code>)</code>

<code>Out[20]: </code>

<code>[</code><code>'root      1033  0.0  0.0  66144  1180 ?        Ss   18:13   0:00 /usr/sbin/sshd'</code><code>,</code>

<code> </code><code>'root      1157  0.0  0.0 100352  4304 ?        Ss   18:13   0:00 sshd: sysadmin [priv]'</code><code>,</code>

<code> </code><code>'sysadmin  1159  0.0  0.0 100496  2024 ?        S    18:13   0:00 sshd: sysadmin@pts/0'</code><code>,</code>

<code> </code><code>'root      1348  0.0  0.0 100352  4312 ?        Ss   18:16   0:00 sshd: sysadmin [priv]'</code><code>,</code>

<code> </code><code>'sysadmin  1350  0.0  0.0 100352  1888 ?        S    18:16   0:00 sshd: sysadmin@pts/1'</code><code>]</code>

<code>In [21]: </code><code>ps</code><code>.</code><code>grep</code><code>(</code><code>'sshd'</code><code>).fields(0,1,8)</code>

<code>Out[21]: </code>

<code>[</code><code>'root 1033 18:13'</code><code>,</code>

<code> </code><code>'root 1157 18:13'</code><code>,</code>

<code> </code><code>'sysadmin 1159 18:13'</code><code>,</code>

<code> </code><code>'root 1348 18:16'</code><code>,</code>

<code> </code><code>'sysadmin 1350 18:16'</code><code>]</code>

  還可以這樣

<code>ps</code><code>.</code><code>grep</code><code>(</code><code>'ssh'</code><code>).fields(1).s</code>

<code>Out[29]: </code><code>'1033 1157 1159 1348 1350'</code>

 2、資訊收集

  a、pdef、pdoc、pfile、pinfo、psoure、psearch函數

    pdef:列印出可調用的對象的定義名或是函數聲明

<code>In [40]: def tmp_space():</code>

<code>   </code><code>....:         </code><code>''</code><code>'return somting directory used info'</code><code>''</code>

<code>   </code><code>....:         tmp_usage = </code><code>'du'</code>

<code>   </code><code>....:         tmp_arg = </code><code>'-h'</code>

<code>   </code><code>....:         path = </code><code>'/tmp'</code>

<code>   </code><code>....:         print </code><code>"Space used in /tmp directory"</code>

<code>   </code><code>....:         subprocess.call([tmp_usage,tmp_arg,path])</code>

<code>   </code><code>....:     </code>

<code>In [41]: pdef tmp_space</code>

<code> </code><code>tmp_space()</code>

   pdoc:輸出注釋資訊與使用示例

<code>In [42]: pdoc tmp_space</code>

<code>Class docstring:</code>

<code>    </code><code>return</code> <code>somting directory used info</code>

<code>Call docstring:</code>

<code>    </code><code>x.__call__(...) &lt;==&gt; x(...)</code>

<code>In [43]:</code>

   pfile:了解代碼如何運作的 【module??】的功能是一樣的

<code>In [46]: </code><code>import</code> <code>commands</code>

<code>In [47]: pfile commands</code>

<code>In [48]: commands??</code>

  pinfo:擷取類型、類、指令空間和注釋等資訊

20

21

22

23

24

25

26

27

28

29

30

31

32

33

<code>In [1]: </code><code>import</code> <code>commands</code>

<code>In [2]: pinfo</code>

<code>%pinfo   %pinfo2  </code>

<code>In [2]: pinfo commands</code>

<code>In [3]: pinfo commands</code>

<code>Type:        module</code>

<code>String form: &lt;module </code><code>'commands'</code> <code>from </code><code>'/usr/local/python27/lib/python2.7/commands.pyc'</code><code>&gt;</code>

<code>File:        </code><code>/usr/local/python27/lib/python2</code><code>.7</code><code>/commands</code><code>.py</code>

<code>Docstring:</code>

<code>Execute shell commands via os.popen() and </code><code>return</code> <code>status, output.</code>

<code>Interface summary:</code>

<code>       </code><code>import</code> <code>commands</code>

<code>       </code><code>outtext = commands.getoutput(cmd)</code>

<code>       </code><code>(exitstatus, outtext) = commands.getstatusoutput(cmd)</code>

<code>       </code><code>outtext = commands.getstatus(</code><code>file</code><code>)  </code><code># returns output of "ls -ld file"</code>

<code>A trailing newline is removed from the output string.</code>

<code>Encapsulates the basic operation:</code>

<code>      </code><code>pipe = os.popen(</code><code>'{ '</code> <code>+ cmd + </code><code>'; } 2&gt;&amp;1'</code><code>, </code><code>'r'</code><code>)</code>

<code>      </code><code>text = pipe.</code><code>read</code><code>()</code>

<code>      </code><code>sts = pipe.close()</code>

<code> </code><code>[Note:  it would be </code><code>nice</code> <code>to add functions to interpret the </code><code>exit</code> <code>status.]</code>

<code>(END)</code>

   psource:通過運作page顯示源代碼

34

35

<code>In [1]: %</code><code>cd</code> <code>/tmp</code>

<code>/tmp</code>

<code>In [2]: </code><code>import</code> <code>temp</code>

<code>In [3]: psource temp</code>

<code>In [4]: psource temp</code>

<code>#!/usr/bin/env python</code>

<code>import</code> <code>subprocess</code>

<code>def tmp_space():</code>

<code>    </code><code>''</code><code>'return somting directory used info'</code><code>''</code>

<code>    </code><code>tmp_usage = </code><code>'du'</code>

<code>    </code><code>tmp_arg = </code><code>'-h'</code>

<code>    </code><code>path = </code><code>'/tmp'</code>

<code>    </code><code>print </code><code>"Space used in /tmp directory"</code>

<code>:</code>

<code>In [5]: psource temp.</code>

<code>temp.main        temp.py          temp.pyc         temp.subprocess  temp.tmp_space   </code>

<code>In [5]: psource temp.tmp_space</code>

<code>    </code><code>subprocess.call([tmp_usage,tmp_arg,path])</code>

  psearch: 根據名稱查找python對象

<code>In [6]: psearch a*</code>

<code>abs</code>

<code>all</code>

<code>any</code>

<code>apply</code>

<code>In [9]: </code><code>import</code> <code>os </code>

<code>In [10]: os.li*? </code><code>#psearch os.li*</code>

<code>os.linesep</code>

<code>os.link</code>

<code>os.listdir</code>

  常用的選項有:

    -s: 指定範圍【範圍空間有builtin,user,user_global,internal和alias】

    -e:排除搜尋範圍

<code>In [17]: %psearch -e </code><code>builtin</code> <code>a*</code>

<code>In [18]: a=</code><code>'abc'</code>

<code>In [19]: %psearch -e </code><code>builtin</code> <code>a*</code>

<code>a</code>

<code>In [24]: psearch -e </code><code>builtin</code> <code>* int</code>

<code>In [25]: psearch -e </code><code>builtin</code> <code>* string</code>

<code>__</code>

<code>___</code>

<code>__doc__</code>

<code>__name__</code>

<code>In [26]: __</code>

<code>Out[26]: </code><code>''</code>

<code>In [27]: ___</code>

<code>Out[27]: </code><code>''</code>

<code>In [28]: __doc__</code>

<code>Out[28]: </code><code>'Automatically created module for IPython interactive environment'</code>

<code>In [29]: a</code>

<code>Out[29]: </code><code>'abc'</code>

  b、who函數:列出所有互動定義的對象

<code>In [30]: </code><code>who</code>

<code>a    os     temp   </code>

<code>In [31]: !</code><code>who</code>

<code>sysadmin pts</code><code>/3</code>        <code>2015-11-12 20:26 (219.235.192.74)</code>

<code>sysadmin pts</code><code>/4</code>        <code>2015-11-12 20:26 (219.235.192.74)</code>

<code>In [32]: </code><code>who</code> <code>str</code>

<code>a  </code>

<code>In [35]: </code><code>who</code> <code>module</code>

<code>os   temp </code>

<code>In [36]: whos</code>

<code>Variable   Type      Data</code><code>/Info</code>

<code>------------------------------</code>

<code>a          str       abc</code>

<code>os         module    &lt;module </code><code>'os'</code> <code>from </code><code>'/usr/l&lt;...&gt;27/lib/python2.7/os.pyc'</code><code>&gt;</code>

<code>temp       module    &lt;module </code><code>'temp'</code> <code>from </code><code>'temp.py'</code><code>&gt;</code>

<code>In [37]: who_ls</code>

<code>Out[37]: [</code><code>'a'</code><code>, </code><code>'os'</code><code>, </code><code>'temp'</code><code>]</code>

  c、rep 函數:

   它是一個自動啟用函數,rep 函數有一些你或覺得有用的參數[對于我來說];不使用還參數的rep可以取回最近處理的結果,并在一行輸出時設定一個字元串表示

<code>In [92]: a=!</code><code>which</code> <code>ls</code>

<code>In [93]: a[0]</code>

<code>Out[93]: </code><code>'/bin/ls'</code>

<code>In [94]: rep</code>

<code>In [95]: </code><code>/bin/ls</code>

<code>In [95]: x=!</code><code>/bin/ls</code>

<code>In [96]: x</code>

<code>Out[96]: </code>

<code>[</code><code>'151111.sql'</code><code>,</code>

<code> </code><code>'151111.tar.gz'</code><code>,</code>

<code> </code><code>'22_40.SQL'</code><code>,</code>

<code> </code><code>'agent2610.log'</code><code>,</code>

<code> </code><code>'crm.log'</code><code>,</code>

<code> </code><code>'ip.log'</code><code>,</code>

<code> </code><code>'ipython_edit_k8BYnO'</code><code>,</code>

<code> </code><code>'ipython_edit_MrCrjh'</code><code>,</code>

<code> </code><code>'ipython_edit_RLhXgZ'</code><code>,</code>

<code> </code><code>'ipython_edit_z87hKG'</code><code>,</code>

<code> </code><code>'pdb-bin.460'</code><code>,</code>

<code> </code><code>'pic'</code><code>,</code>

<code> </code><code>'temp.py'</code><code>,</code>

<code> </code><code>'temp.pyc'</code><code>,</code>

<code> </code><code>'user.log'</code><code>]</code>

<code>In [97]:</code>

ipython 正确的打開方式

三、總結

 ipython這完全是一個神奇的shell,集文本編輯器、互動會話于一體的工具包,優其是在字元串處理方面,以後的日常工作就可以用ipython當/bin/bash了,對于菜鳥【主要是我】來說可以更好學習python。

本文轉自 jinlinger 51CTO部落格,原文連結:http://blog.51cto.com/essun/1712322,如需轉載請自行聯系原作者