胶水Python

IPython的进阶使用:魔法命令

2018-12-31  本文已影响74人  爱折腾的大懒猪

该文已收录至笔记, 不再更新 Last Update: 2019.1.22.
对应上一篇是 IPython基础使用.

  • 简单命令
  • Shell与IPython交互
  • 配置IPython和定制功能
  • 方便的文件目录内容操作
  • 更复杂的查看历史记录
  • 查看文件和快速调入命令
  • 强大的测试功能
  • 其他的交互

简单命令


获得帮助 %magic / %lsmagic / %quickref / %man / %pinfo / %pinfo2

文件的复制删除移动

这些和Shell命令基本一致.

清除和重置 %clear %reset %reset_selective %xdel

对象通配符搜索 %psearch

可以找出命名空间中符合通配符式的对象.
该用法和*Error? 一致 (最后必须是?), 等价于%psearch *Error.

通式 : %psearch [options] PATTERN [OBJECT TYPE]

输出形式控制 %pprint %precision %page %doctest_mode %xmode %colors


Shell与IPython交互


执行Shell命令 %sc %sx %system

三者都是执行命令并捕获输出. %sx%system等价.

%sc

%sc 实际是!的原始命令. 格式是 %sc [options] varname=command. 原始的sc会利用commands.getoutput()执行命令并捕获返回, 该返回会储存到变量名中, 捕获的是原始的字符串(包含\n等). varname=这里是强制必须的.

例如, %sc -l var = ls ~var = !ls ~以及var=%sx ls ~等价.

%sx / %system

%sx 命令相当于!!命令的效果. 会根据换行符分割输出并保存到列表当中进行返回. 有点类似%sc -l的效果. 返回的输出同样支持上述的a.l,a.x,a.n.

环境变量 %env %set_env

该魔法也可赋值, 支持%env var val, %env var=val%env var=$val. 最后这种可以使用python变量.

执行脚本 %%script %killbgscripts

    In [1]: %%script bash
       ...: for i in 1 2 3; do
       ...:   echo $i
       ...: done

配置IPython和定制功能


很多储存下来的配置会保存到~/.ipython/profile_default/db/下的相应文件中.

%alias / %unalias / %alias_magic 别名功能

定义别名用于系统命令. 用法: alias 别名 指令. 别名的优先级低于魔术命令以及python变量. 删除别名可以用unalias 别名.

In [1]: alias parts echo first %s second %s
In [2]: %parts A B
  first A second B
In [3]: %parts A
  Incorrect number of arguments: 2 expected.
  parts is an alias to: 'echo first %s second %s'
In [6]: alias show echo
In [7]: PATH='A Python string'
In [8]: show $PATH
  A Python string
In [9]: show $$PATH
  /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...

一般, 别名定义后仅对该次对话起效. 如果想要日后也可以使用, 可以使用%store储存起来.

ln [4]: %alias largest ls -1sSh | grep %s
ln [5]: %store largest
Alias stored: largest (ls -1sSh | grep %s)
## 重启对话后, 使用`%store -r`来恢复.
魔法别名 %alias_magic

形式: %alias_magic [-l] [-c] name target 可以创建魔法的别名, -l是行魔法(%开头), -c是cell魔法(%%开头). 不加选项则两种同时设置. 如果不存在魔法可能报错.

In [1]: %alias_magic t timeit
  Created `%t` as an alias for `%timeit`.
  Created `%%t` as an alias for `%%timeit`.
In [4]: %alias_magic --cell whereami pwd
  UsageError: Cell magic function `%%pwd` not found.
In [5]: %alias_magic --line whereami pwd
  Created `%whereami` as an alias for `%pwd`.

可执行文件导入到别名列表 %rehashx

该命令会检查每一个在$PATH搜索路径中的可执行文件, 并把该可执行文件储存为别名. 对于window针对exe/com/bat文件. 该命令同时会重置模块补全的root模块缓存.

%store 储存变量或别名

轻量级储存python变量. 可以储存变量, alias定义的别名等. 格式是%store [变量], 如果不加变量, 将会显示储存的所有变量及值. 变量需要时pickleable的(参看pickle模块).

%macro 定制宏

可以将部分历史记录到指定为宏mname, 格式:
%macro [options] mname n1-n2 n3-n4 ... n5 .. n6 ...

接受历史记录范围, 文件名以及字符串对象作为宏的定义. 定义的宏的内容可以print 宏名显示出来.

输入范围内容格式可参考%history所使用的记录形式.

%macro my_macro 44-47 49

%bookmark 目录标签

格式%bookmark 标签名 目录, 可以将某个目录定义为标签, 使用cd -b 标签名可以跳转到标签(不产生歧义前提下, 可以不要-b). 书签会被保存, 在以后的对话中均起效. 更多bookmark使用参看后面的部分介绍.

自动功能的设置 %autoindent / %automagic / %autocall

加载IPython扩展 %load_ext %unload_ext %reload_ext

可以加载%load_ext或卸载%unload_ext 或重新加载%reload_ext 一些扩展模块. 参数是模块名. 如何安装或定制扩展插件请参看别的材料.

扩展插件可参看官方文档的介绍, 例如一些扩展的魔法autoreload, storemagic, oct2py等等.

配置IPython %config

格式 %config Class[.trait=value]. 只输入%config可以输出可以设置的类对象, 输入%config 类对象 可以查看该对象可以设置的项和参考的值.

除非明确知道要设置什么, 否则一般不用动该命令.


方便的文件目录内容操作


%cd 工作目录切换

%pwd 和 %ls 显示当前目录及目录内容

%bookmark 目录书签

%bookmark 命令可以保存工作目录书签. 工作目录书签即使登出后再登入仍然有效, 会被保存到~/.ipython/profile_default/db/bookmarks内.

%dhist 目录历史记录

显示当前会话的目录的历史.

%pushd, %popd, %dirs 目录堆栈

这三个命令和bash的用法略有不同.


更复杂的查看历史记录


%history / %hist 历史命令记录

可以查看历史命令, 包括本会话或者全局. 可以加入历史编号. 简称为%hist. 默认显示当前会话的历史记录.

历史记录的格式是会话号/行数. 上一个会话第7-10行: %hist ~1/7-10, 这里~表示当前会话之前N个会话. 甚至可以是 ~8/1-~6/5跨会话的范围. 支持多个范围, 用空格隔开.

记录器 %logstart / %logstop / %logon / %logoff / %logstate

%logstart [-o|-r|-t] [log_name [log_mode]]

logstart会启动记录器并将命令记录到某个py文件. 他有几种工作模式:

  1. append : 追加模式, 将记录追加到某个文件.
  2. backup : 备份模式, 将任何已存在的文件重命名为name~,再开始name文件的记录.
  3. global : 将记录追加到用户目录下的一个log文件.
  4. over : 覆盖任何已存在的文件.
  5. rotate : 顺序记录文件, 例如name.1~,name.2~等.

上述命令通式的参数:

%save 保存历史记录到文件

可以保存历史记录和宏到指定文件filename, 格式:
%save [options] filename n1-n2 n3-n4 ... n5 .. n6 ...

输入范围内容格式可参考%history所使用的记录形式.

%notebook 保存为notebook

使用%notebook 文件名, 可以将当期会话的历史记录输出到一个notebook文件(.ipynb).

%pastebin 上传代码到Gist Pastebin

用法: %pastebin [-d "Custom description"] 1-7, 返回相应的URL.


查看文件和快速调入命令


显示和编辑文件内容

源文件内容查看 : %pfile / %pdoc / %pdef / %psource

可以显示变量/对象的特定信息, 如函数的源代码(%psource), 文件的源代码(%pfile),文档字符串(%pdoc)、定义头部(%pdef).

%pfile魔法命令也可以接收一个Python文件名,将会以代码高亮的形式打印文件的内容。

加载代码: %load / %loadpy

可以读取一个文件, URL, 历史记录范围, macro宏, 或者用户命名空间元素.

%load myscript.py
%load 7-27
%load myMacro
%load http://www.example.com/myscript.py
%load -r 5-10 myscript.py
%load -r 10-20,30,40: foo.py
%load -s MyClass,wonder_function myscript.py
%load -n MyClass
%load -n my_module.wonder_function

上个输出变输入或调用历史输入 %recall / %rep

%recall, 简化是%rep. 不加参数直接获取上一次命令的输出, 或加参数提取某个历史命令.

In[2]: "".join(l)
Out[2]: heivaan
In[3]: %recall
In[4]: heivaan   # 自动填入上次的结果.
# 可以用于调用历史命令, 行数参考%hist
ln[5]: %recall 45 
ln[6]: %recall 1-4

重新运行: %rerun

重复上次的输入. %rerun是重复上次的输入并运行. %rerun 1-4是重复运行历史命令1-4.

粘贴内容 %paste / %cpaste


强大的测试功能


%run 运行脚本

可以直接执行脚本。%run file [args], args是可以传入到执行脚本的参数。脚本运行后, 变量将继续保留到交互的命名空间中. 文件运行时, 默认只会传入__name__=='__main__'sys.argv的变量, 像一般执行脚本一样运行. 如果文件名后缀是.ipy[nb],将会以ipython脚本来执行.

%prun 代码分析器运行脚本

%prun会使用代码分析器(python code profiler)来运行代码, 这点和run直接用解释器运行不同. 他并不是运行一个文件 (不同于%run), 而是运行后续的一行代码或一块代码(cell模式, 可以在prun后同时跟上表达式). 代码分析器运行类似于profile.run()的效果, 命名空间会内部进行管理.

%run -p file.py 可以对文件使用代码分析器.

逐行分析: %lprun / %mprun / %memit

这三个魔法命令需要安装逐行分析工具line_profilermemory_profiler包后才能使用. 他们和前面的prun类似可以对代码运行进行分析和统计, 核心是可以对每行的代码都进行统计, 从而分析代码执行时那些代码消耗资源更多. lprun主要是时间, mprun主要是逐行内存分析, memit单个表达式内存分析.

最近报错反馈 %tb

会打印最近的一次traceback报错的信息.

%debug 和 %pdb 进行快速debug

ipython带有一个强大的调试器ipdb。无论何时控制台抛出了一个异常,我们都可以使用%debug魔法命令在最近的异常点启动调试器。接着你就能在调试模式下访问所有的本地变量和进行整个栈的回溯。在调试器中输入命令可以进行调试:

我们也可以使用%pdb 魔法命令来激活IPython调试器,这样,每当异常抛出时,调试器就会自动运行。(不用再手动%debug进入ipdb)

运行时间分析: %time和%timeit

%time

可以直接对后面的单行表达式进行运行时间的统计. 在notebook的cell里, 可以统计整个cell的运行时间, 此时后面不要跟表达式.

%timeit

%time类似, timeit可用于单行代码, 也可以用于cell中, 用于运行时间的统计. timeit更为高级, 可以直接指定运行的次数和循环数. 进行更细节的分析.

In [24]: %timeit [x*x for x in range(100000)]
100 loops, best of 3: 15.3 ms per loop
## 100 loops是-n控制, 一次循环的重复数. best of 3是3次循环最佳的一次. 

变量查询 %who %whos %who_ls

均会返回当前交互命令下命名空间的变量(包括模块, 函数等), 均支持参数指定返回的类型, 例如who str就只会返回str类型的变量. 还如function, class, module等.


其他的交互


%matplotlib Matplotlib交互

%pylab PyLab交互

加载Numpy和Matplotlib进行交互. 实际会进行以下内容, 因此可以直接调用相应内容.

import numpy
import matplotlib
from matplotlib import pylab, mlab, pyplot
np = numpy
plt = pyplot

from IPython.display import display
from IPython.core.pylabtools import figsize, getfigs

from pylab import *
from numpy import *

%gui 开关GUI事件循环集成

详情请看帮助.

上一篇下一篇

猜你喜欢

热点阅读