ipython使用_Ipython使用指南

一、简介

2001年,Fernando Perez为了得到一个更为高效的交互式Python解释器而启动的一个项目,IPython不仅仅是一个加强版的shell,他可以直接进行绘图操作的GUI控制台,一个基于web的交互式笔记本,以及一个轻量级的快速并行计算引擎。

ipython是一个升级版的交互式python命令行工具.

二、ipython安装

一、在已有Python环境安装

pip install ipython

等到命令执行完成后显示successfully表示完装成功,如下图

1133627-20171031082111527-127066202.png

安装完,在命令提示符下输入ipython就可以启动ipython了

其与原版python命令行工具不同在于ipython的提示符变成了in和out.

in为输入命令的地方,out为命令执行完成后输出的地方

1133627-20171031082132527-2083752860.png

三、ipython常用操作

一、tab键自动补全一些常用的方法

1133627-20171031082145886-1497288213.png

1、常用命令

1 启动:ipython/ipython qtconsole –pylab=inline2 Tab键自动补全

二、系统命令

1、支持一些系统命令

In [2]: pwd #显示当前所在目录

Out[2]: '/root'In [3]: cd .. #返回当前目录的上一级目录

/

2、执行系统命令(!)

In [6]: !ifconfig

ens33: flags=4163 mtu 1500inet192.168.81.10 netmask 255.255.255.0 broadcast 192.168.81.255inet6 fe80::a545:8b99:d507:4d0f prefixlen64 scopeid 0x20ether00:0c:29:95:d5:31 txqueuelen 1000(Ethernet)

RX packets12851 bytes 9887304 (9.4MiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets7172 bytes 1546188 (1.4MiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73 mtu 65536inet127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10loop txqueuelen1(Local Loopback)

RX packets140 bytes 12132 (11.8KiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets140 bytes 12132 (11.8KiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

In [7]: !ip a1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet127.0.0.1/8scope host lo

valid_lft forever preferred_lft forever

inet6 ::1/128scope host

valid_lft forever preferred_lft forever2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether 00:0c:29:95:d5:31brd ff:ff:ff:ff:ff:ff

inet192.168.81.10/24 brd 192.168.81.255 scope globalens33

valid_lft forever preferred_lft forever

inet6 fe80::a545:8b99:d507:4d0f/64scope link

valid_lft forever preferred_lft forever

In [8]: !cat /etc/sysconfig/selinux

三、内省(?)

在变量名或命令的前面或后面加一个 “?” 并执行,可以用于显示该对象的一些通用信息,如对象类型、文档字符串等,这就叫做对象内省。这种操作查看到的信息,尤其是函数和类的信息,比通常直接引用变量名然后回车所看到的(repr)要好。“?” 的另一个用法是可以搜索 IPython 的命名空间,配合通配符使用效果如下:

In [1]:importnumpy as np

In [2]:np.load?

np.load

np.loads

np.loadtxt

np.pkgload

使用双问号“??”还可以查看对象的源代码(如果可见的话)。

四、常用快捷键

1 Ctrl-P 或上箭头键 后向搜索命令历史中以当前输入的文本开头的命令2 Ctrl-N 或下箭头键 前向搜索命令历史中以当前输入的文本开头的命令3 Ctrl-R 按行读取的反向历史搜索(部分匹配)4 Ctrl-Shift-v 从剪贴板粘贴文本5 Ctrl-C 中止当前正在执行的代码6 Ctrl-A 将光标移动到行首7 Ctrl-E 将光标移动到行尾8 Ctrl-K 删除从光标开始至行尾的文本9 Ctrl-U 清除当前行的所有文本译注1210 Ctrl-F 将光标向前移动一个字符11 Ctrl-b 将光标向后移动一个字符12 Ctrl-L 清屏

五、魔术命令

在 IPython 的会话环境中,所有文件都可以通过 %run 命令来当做脚本执行,并且文件中的变量也会随即导入当前命名空间。即,对于一个模块文件,你对他使用 %run 命令的效果和 from module import * 相同,除非这个模块文件定义了 main 函数(if name == ‘main:’),这种情况下 main 函数还会被执行。

这种以 % 开头的命令在 IPython 中被称为魔术命令,用于加强 shell 的功能。常用的魔术命令有:

1 %quickref 显示ipython的快速参考2 %magic 显示所有的魔术命令的详细文档3 %debug 从最新的异常跟踪的底部进入交互式调试器4 %hist 打印命令的输入(可选输出)历史5 %pdb 在异常发生后自动进入调试器6 %paste 执行剪贴板中的python代码7 %cpaste 打开一个特殊提示符以便手工粘贴待执行的python代码8 %reset 删除interactive命名空间中的全部变量/名称9 %page OBJECT 通过分页器打印输出object10 %run script.py 在ipython中执行一个python脚本文件11 %prun statement 通过cprofile执行statement,并打印分析器的输出结果12 %timestatement 报告statement的执行时间13 %timeit statement 多次执行statement以计算系统平均执行时间.对那么执行时间非常小的代码很有用14 %who,%who_id,%whos 显示interactive命名空间中定义的变量,信息级别/冗余度可变15 %xdel variable 删除variable,并尝试清除其在ipython中的对象上的一切引用

对魔术命令不熟悉的话可以通过 %magic 查看详细文档;对某一个命令不熟悉的话,可以通过 %cmd? 内省机制查看特定文档。值得一提的是,IPython 中使用 del 命令无法删除所有的变量引用,因此垃圾回收机制也无法启用,所以有些时候你会需要使用 %xdel 或者 %reset。

1、测试代码的执行时间:

%time和%timeit

2、目录书签系统( 对目录做别名)

In [55]: %bookmark local /usr/local # 定义local书签

In [56]: %bookmark selinux /etc/sysconfig/selinux # 定义selinux书签

In [57]: %bookmark -l # 显示所有的书签

Current bookmarks:

local-> /usr/local

selinux-> /etc/sysconfig/selinux

In [55]: %bookmark local /usr/local

In [56]: %bookmark sysconfig /etc/sysconfig

In [57]: %bookmark -l

Current bookmarks:

local-> /usr/local

sysconfig-> /etc/sysconfig

In [58]: pwdOut[58]: '/'In [59]: cd local

(bookmark:local)-> /usr/local/usr/local

In [60]: pwdOut[60]: '/usr/local'In [61]: cd sysconfig

(bookmark:sysconfig)-> /etc/sysconfig/etc/sysconfig

In [62]: pwdOut[62]: '/etc/sysconfig'

3、记录历史输入和输出

IPython能够记录整个控制台会话,包括输入和输出。执行%logstart即可开始记录日志。IPython的日志功能可以在任何时刻开启,它将记录你的整个会话(包括此前的命令)。此外还可以看看几个与之配套的魔术命令%logoff,%logon,%logstate以及%logstop。

4、与操作系统交互(IPython魔术命令)

命令说明

!cmd

在系统shell中执行cmd

output=!cmd args

执行cmd,并将stdout存放在output中

%alias alias_name cmd

为系统shell命令定义别名

bookmark

使用IPython的目录书签系统

%cd directory

将系统工作目录更改为directory

%pwd

返回系统的当前工作目录

%pushd directory

将当前目录入栈,并转向目标目录

%popd

弹出栈顶目录,并转向目标目录

%dirs

返回一个含有当前目录栈的列表

%dhist

打印目录访问历史

%env

以dict形式返回系统环境变量

六、ipython notebook

1、安装jupyter

pip install jupyter

2、运行界面

1012327-20180804201116184-2111711659.png

1012327-20180804201153955-1216775223.png

1012327-20180804201223845-1731972739.png

四、ipython高级用法

一、alias

In [3]: %alias largest ls -1sSh | grep %s

In [4]: largest to

total 42M

20K tokenize.py

16K tokenize.pyc8.0K story.html4.0K autopep84.0K autopep8.bak4.0K story_layout.html

注意:别名需要存储的, 否则重启ipython就不存在了:

In [5]: %store largest

Alias stored: largest (ls -1sSh | grep %s)

下次进入的时候%store -r

二、ipcluster - 并行计算

其实ipython提供的方便的并行计算的功能. 先回答ipython做并行计算的特点:

wget http://www.gutenberg.org/files/27287/27287-0.txt

1、第一个版本是直接的, 大家习惯的用法

In [1]: import re

In [2]: import io

In [3]: non_word = re.compile(r'[Wd]+', re.UNICODE)

In [4]: common_words ={

...:'the','of','and','in','to','a','is','it','that','which','as','on','by',

...:'be','this','with','are','from','will','at','you','not','for','no','have',

...:'i','or','if','his','its','they','but','their','one','all','he','when',

...:'than','so','these','them','may','see','other','was','has','an','there',

...:'more','we','footnote', 'who', 'had', 'been', 'she', 'do', 'what',

...:'her', 'him', 'my', 'me', 'would', 'could', 'said', 'am', 'were', 'very',

...:'your', 'did', 'not',

...: }

In [5]: def yield_words(filename):

...: import io

...: with io.open(filename, encoding='latin-1') as f:

...:for line inf:

...:for word in line.split():

...: word= non_word.sub('', word.lower())

...:if word and word not incommon_words:

...: yield word

...:

In [6]: def word_count(filename):

...: word_iterator=yield_words(filename)

...: counts={}

...: counts= defaultdict(int)

...:whileTrue:

...: try:

...: word=next(word_iterator)

...: except StopIteration:

...: break

...:else:

...: counts[word]+= 1...: return counts

...:

In [6]: from collections import defaultdict # 脑残了 忘记放进去了..

In [7]: %time counts =word_count(filename)

CPU times: user88.5 ms, sys: 2.48 ms, total: 91ms

Walltime: 89.3 ms

ipython运行一下

ipcluster start -n 2 # 好吧, 我的Mac是双核的

2、ipython 并行计算的用法:

In [1]: from IPython.parallel import Client # import之后才能用%px*的magic

In [2]: rc =Client()

In [3]: rc.ids # 因为我启动了2个进程

Out[3]: [0, 1]

In [4]: %autopx # 如果不自动 每句都需要: `%px xxx`%autopx enabled

In [5]: import os # 这里没autopx的话 需要: `%px import os`

In [6]: print os.getpid() # 2个进程的pid

[stdout:0] 62638[stdout:1] 62636In [7]: %pxconfig --targets 1# 在autopx下 这个magic不可用

[stderr:0] ERROR: Line magic function `%pxconfig` not found.

[stderr:1] ERROR: Line magic function `%pxconfig` not found.

In [8]: %autopx # 再执行一次就会关闭autopx%autopx disabled

In [10]: %pxconfig --targets 1# 指定目标对象, 这样下面执行的代码就会只在第2个进程下运行

In [11]: %%px --noblock # 其实就是执行一段非阻塞的代码

....: importtime....:time.sleep(1)

....: os.getpid()

....:

Out[11]: In [12]: %pxresult # 看 只返回了第二个进程的pid

Out[1:21]: 62636In [13]: v =rc[:] # 使用全部的进程, ipython可以细粒度的控制那个engine执行的内容

In [14]: with v.sync_imports(): # 每个进程都导入time模块

....: importtime....:

importingtimeon engine(s)

In [15]: def f(x):

....:time.sleep(1)

....: return x*x

....:

In [16]: v.map_sync(f, range(10)) # 同步的执行

Out[16]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

In [17]: r = v.map(f, range(10)) # 异步的执行

In [18]: r.ready(), r.elapsed # celery的用法

Out[18]: (True, 5.87735)

In [19]: r.get() # 获得执行的结果

Out[19]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

入正题:

In [20]: def split_text(filename):

....: text=open(filename).read()

....: lines=text.splitlines()

....: nlines=len(lines)

....: n= 10....: block= nlines//n

....: for i inrange(n):

....: chunk= lines[i*block:(i+1)*(block)]

....: with open('count_file%i.txt' % i, 'w') as f:

....: f.write('n'.join(chunk))

....: cwd=os.path.abspath(os.getcwd())

....: fnames= [ os.path.join(cwd, 'count_file%i.txt' % i) for i inrange(n)] # 不用glob是为了精准

....: return fnames

In [21]: from IPython import parallel

In [22]: rc =parallel.Client()

In [23]: view =rc.load_balanced_view()

In [24]: v =rc[:]

In [25]: v.push(dict(

....: non_word=non_word,

....: yield_words=yield_words,

....: common_words=common_words

....: ))

Out[25]: In [26]: fnames =split_text(filename)

In [27]: def count_parallel():

.....: pcounts=view.map(word_count, fnames)

.....: counts= defaultdict(int)

.....:for pcount inpcounts.get():

.....:for k, v inpcount.iteritems():

.....: counts[k]+=v

.....: return counts, pcounts

.....:

In [28]: %time counts, pcounts =count_parallel() # 这个时间包含了我再聚合的时间

CPU times: user47.6 ms, sys: 6.67 ms, total: 54.3 ms # 是不是比直接运行少了很多时间?Walltime: 106ms # 这个时间是

In [29]: pcounts.elapsed, pcounts.serial_time, pcounts.wall_time

Out[29]: (0.104384, 0.13980499999999998, 0.104384)