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__(...) <==> 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: <module </code><code>'commands'</code> <code>from </code><code>'/usr/local/python27/lib/python2.7/commands.pyc'</code><code>></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>&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 <module </code><code>'os'</code> <code>from </code><code>'/usr/l<...>27/lib/python2.7/os.pyc'</code><code>></code>
<code>temp module <module </code><code>'temp'</code> <code>from </code><code>'temp.py'</code><code>></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這完全是一個神奇的shell,集文本編輯器、互動會話于一體的工具包,優其是在字元串處理方面,以後的日常工作就可以用ipython當/bin/bash了,對于菜鳥【主要是我】來說可以更好學習python。
本文轉自 jinlinger 51CTO部落格,原文連結:http://blog.51cto.com/essun/1712322,如需轉載請自行聯系原作者