跳到主要内容

记录在 jupyter 这样的 Ipython 环境中能用到的 shell 命令和 magic 命令

shell 命令

在进行交互式计算时,通常需要访问底层 shell。这可以通过使用感叹号(或砰)来实现。!

这允许在行开头存在时执行简单的命令:

In[1]: !pwd
/User/home/

更改目录:

In[1]: !cd /var/etc

或编辑文件:

In[1]: !mvim myfile.txt

砰的一行可以调用任何安装在底层 shell 中的程序,并支持以或的形式进行变量扩展。后一种形式的扩展支持任意 python 表达式:$variable``{variable}

In[1]: file = 'myfile.txt'

In[2]: !mv $file {file.upper()}

砰()也可以出现在作业的右侧,紧跟在等号之后,或者用空格与它隔开。在这种情况下,爆炸后命令的标准输出将在类似列表的对象中拆分成行,并分配给左侧。!

例如,这允许您将当前工作目录的文件列表放在变量中:

In[1]: my_files = !ls

您可以将不同的可能性组合在 for 循环、条件、函数中...

my_files = !ls ~/
for i, file in enumerate(my_files):
raw = !echo $backup $file
!cp $file {file.split('.')[0] + '.bak'}

还可以查看 pip 安装的包

!pip list

magic 命令

魔术函数(magics)通常以类似 shell 的语法的形式存在,但它们是引擎盖下的 python 函数。语法和赋值可能性与 bang(!)语法类似,但具有更大的灵活性和功能。魔术函数以百分号(%)或双百分号(%%)开头。

带有单个百分号的魔术呼叫将仅作用于一行:

In[1]: %xmode
Exception reporting mode: Verbose

魔术支持分配:

In [1]: results = %timeit -r1 -n1 -o list(range(1000))
1 loops, best of 1: 21.1 µs per loop

In [2]: results
Out[2]: <TimeitResult : 1 loops, best of 1: 21.1 µs per loop>

带有双百分号(%%)的魔术可以分布在多行上,但它们不支持赋值

In[1]: %%bash
... : echo "My shell is:" $SHELL
... : echo "My disk usage is:"
... : df -h
My shell is: /usr/local/bin/bash
My disk usage is:
Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
/dev/disk1 233Gi 216Gi 16Gi 94% 56788108 4190706 93% /
devfs 190Ki 190Ki 0Bi 100% 656 0 100% /dev
map -hosts 0Bi 0Bi 0Bi 100% 0 0 100% /net
map auto_home 0Bi 0Bi 0Bi 100% 0 0 100% /hom

详细参考

内置魔术命令 — IPython 8.0.1 文档

我常用的

%time 用于计算运行时间

%timeit 用于计算多次运行的平均时间