http://my.oschina.net/chihz/blog/207624?utm_source=tuicool&utm_medium=referral
之前早就听说IPython是个神器,但是一直拖到现在才去学习使用。很多比较时髦的语言都会带一个可以直接交互的shell,python自不必说,像Scala、Ruby、Erlang这些语言的交互shell我也都用过一点儿。但用了IPython之后就颠覆了我对交互shell这东西的认知 —— 真的是神器。
1. 安装
我是在ubuntu下使用IPython,安装非常的简单,只需要
sudo apt-get install ipython-notebook
就可以了。安装成功,输入ipython就可以使用,使用方法跟平时的python交互shell基本一致。不同的是有了tab自动补全和语句编号,以及下面的一连串神奇的功能:
2. 查看对象的信息
查看对象的信息是IPython的一项基本功能,通过在模块或者函数名后面加?或者??就可以查看这个对象的信息。
1
2
3
4
5
|
In [
1
]:
import
random
In [
2
]: random??
In [
3
]: random?
|
查看对象信息还有一些内建的指令:
%pdoc <obj name> 查看对象的pydoc
%psource <obj name> 查看对象的源码,C扩展的话会有问题
%pdef <function name> 查看函数的声明
%pfile <obj name> 查看所在的源码文件
3. 指令
像%pdoc、%psource、%pdef这些都是IPython中的内建指令,这样的指令有很多,可以通过%magic查看所有的指令,也可以通过%func <name> 来查看具体某个指令的说明,通过%lsmagic可以列出所有的指令列表
在IPython中,指令分为两种,以%开头的叫做line magic,这种类型的指令只能作用与一行代码。比如:
1
2
3
|
In [
5
]:
%
time a
=
1
CPU times: user
0
ns, sys:
0
ns, total:
0
ns
Wall time:
17.9
µs
|
以%%开头的叫做cell magic,这种类型的指令可以作用于一个代码块,比如:
1
2
3
4
5
6
|
In [
7
]:
%
%
time
for
i
in
xrange
(
1000000
):
pass
...:
CPU times: user
44
ms, sys:
12
ms, total:
56
ms
Wall time:
48.4
ms
|
我们可以对指令进行自定义,做法非常的简单,比如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import
time
from
IPython.core.magic
import
(
register_line_magic,
register_cell_magic,
register_line_cell_magic
)
def
_test_exec_time(code):
begin_time
=
time.time()
exec
(code)
print
"used time:"
, time.time()
-
begin_time
@register_line_magic
def
line_my_time(line):
_test_exec_time(line)
@register_cell_magic
def
cell_my_time(line, cell):
_test_exec_time(cell)
@register_line_cell_magic
def
line_cell_my_time(line, cell
=
None
):
if
cell
is
None
:
_test_exec_time(line)
else
:
_test_exec_time(cell)
|
我们自己来实现了一个计时指令,只要使用@register_line_magic、@register_cell_magic和@register_line_cell_magic就可以做到。把这个文件以.py结尾命名保存到/home/samchi/.config/ipython/profile_default/startup中,每次启动IPython的时候就会运行这个目录下的文件。重新进入IPython,进行测试:
1
2
3
4
5
6
7
8
|
In [
2
]:
%
line_my_time a
=
1
used time:
0.000108957290649
In [
3
]:
%
%
cell_my_time
...:
for
i
in
xrange
(
10000
):
...:
pass
...:
used time:
0.00216698646545
|
4. run & edit
通过%run <外部脚本路径> 可以运行一个外部的python script,并把运行结果导入到当前的IPython上下文环境,好比说外部脚本定义了一个变量a,那么通过%run运行这个脚本之后就可以在IPython中继续使用这个变量。
如果需要编写一大段代码不适合使用IPython,那么就可以使用%edit指令,%edit指令能启动文本编辑器,在文本编辑器中编辑一段代码,保存退出后就可以在IPython中执行。
5. 与系统命令交互
在IPython中可以很方便的使用Linux命令,只需要一个!就可以,比如:
1
2
3
|
In [
4
]: !ping baidu.com
PING baidu.com (
123.125
.
114.144
)
56
(
84
) bytes of data.
64
bytes
from
123.125
.
114.144
: icmp_req
=
1
ttl
=
35
time
=
543
ms
|
可以把Linux命令的运行结果赋值给一个python的变量:
1
2
3
4
|
In [
5
]: name
=
!echo
"hello"
In [
6
]: name
Out[
6
]: [
'hello'
]
|
还可以把Python的变量结合到Linux命令中,只需要使用一个$就可以,比如:
1
2
3
4
|
In [
11
]: name
=
"My name is Sam"
In [
12
]: !echo $name
My name
is
Sam
|
6. 使用Log来记录会话
没错,IPython的会话是可以保存的,只要指定记录的log就可以了。
使用%logstart [logname [logmode]] 就可以开启IPython log,logname是日志保存的路径,logmode是日志模式,有四种模式可选:
over: 如果存在那么覆盖之前的log
backup: 这是默认的模式,会将之前的log备份,比如将log_name backup为log_name~
append: 追加
rotate: 回滚,会保持这样的文件名,比如logname.1~ logname.2~ logname.3~等等
7. 将IPython集成到自己的代码中
我们可以将IPython集成到自己的项目中,这样特别方便调试,只需要:
1
2
|
import
IPython
Ipython.embed()
|
可以把项目的上下文包含进来。但是值的注意的是这样虽然可以访问代码的上下文变量,但是在IPython中的修改不会回馈到原先的代码当中,参考这个例子:
http://mail.scipy.org/pipermail/ipython-user/2011-September/008496.html
8. 总结
这些是我自己觉着IPython比较有用的一些功能,但是IPython的功能远远不止这些,国外甚至有人针对IPython专门写了本书!用起来,慢慢挖掘剩余的功能吧。