与操作系统交互
IPython的另一个重要特点就是它跟操作系统shell结合得非常紧密。也就是说,你可以直接在IPython中实现标准的Windows或UNIX(Linux、OS X)命令行活动。比如执行shell命令、更改目录、将命令的执行结果保存在Python对象(列表或字符串)中等。此外,它还提供了shell命令别名以及目录书签等功能。
表3-3总结了用于调用shell命令的魔术命令及其语法。我将在后面几节中简要介绍这些功能。
shell命令和别名
在IPython中,以感叹号(!)开头的命令行表示其后的所有内容需要在系统shell中执行。也就是说,你可以删除文件(根据OS的不同,使用rm或del)、修改目录或执行任意其他处理过程。甚至还可以启动一些能将控制权从IPython手中夺走的进程(比如另外再启动一个Python解释器):
- In [2]: !python
- Python 2.7.2 |EPD 7.1-2 (64-bit)| (default, Jul 3 2011, 15:17:51)
- [GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2
- Type "packages", "demo" or "enthought" for more information.
- >>>
此外,还可以将shell命令的控制台输出存放到变量中,只需将!开头的表达式赋值给变量即可。例如,我的Linux电脑通过以太网连接到互联网,于是可以将我的IP地址存到一个Python变量中去:译注13
- In [1]: ip_info = !ifconfig eth0 | grep "inet"
- In [2]: ip_info[0].strip()
- Out[2]: 'inet addr:192.168.1.137 Bcast:192.168.1.255 Mask:255.255.255.0'
返回的Python对象ip_info实际上是一个含有控制台输出结果的自定义列表类型。
在使用!时,IPython还允许使用当前环境中定义的Python值。只需在变量名前面加上美元符号($)即可:译注14
- In [3]: foo = 'test*'
- In [4]: !ls $foo
- test4.py test.py test.xml
魔术命令%alias可以为shell命令自定义简称。例如:
- In [1]: %alias ll ls -l
- In [2]: ll /usr
- total 332
- drwxr-xr-x 2 root root 69632 2012-01-29 20:36 bin/
- drwxr-xr-x 2 root root 4096 2010-08-23 12:05 games/
- drwxr-xr-x 123 root root 20480 2011-12-26 18:08 include/
- drwxr-xr-x 265 root root 126976 2012-01-29 20:36 lib/
- drwxr-xr-x 44 root root 69632 2011-12-26 18:08 lib32/
- lrwxrwxrwx 1 root root 3 2010-08-23 16:02 lib64 -> lib/
- drwxr-xr-x 15 root root 4096 2011-10-13 19:03 local/
- drwxr-xr-x 2 root root 12288 2012-01-12 09:32 sbin/
- drwxr-xr-x 387 root root 12288 2011-11-04 22:53 share/
- drwxrwsr-x 24 root src 4096 2011-07-17 18:38 src/
可以一次执行多条命令,只需将它们写在一行上并以分号隔开即可:
- In [558]: %alias test_alias (cd ch08; ls; cd ..)
- In [559]: test_alias
- macrodata.csv spx.csv tips.csv
注意,IPython会在会话结束时立即“忘记”你所定义的一切别名。为了创建永久性的别名,你需要使用配置系统。本章稍后会对此进行介绍。
目录书签系统
IPython有一个简单的目录书签系统,它使你能保存常用目录的别名以便实现快速跳转。比如说,作为一名狂热的Dropbox用户,为了能够快速地转到我的Dropbox目录,我可以定义一个书签:
- In [6]: %bookmark db /home/wesm/Dropbox/
在定义好书签之后,就可以在执行魔术命令%cd时使用这些书签了:
- In [7]: cd db
- (bookmark:db) -> /home/wesm/Dropbox/
- /home/wesm/Dropbox
如果书签名与当前工作目录中的某个目录名冲突,可以通过-b标记(其作用是覆写)使用书签目录。%bookmark的-l选项的作用是列出所有书签:
- In [8]: %bookmark -l
- Current bookmarks:
- db -> /home/wesm/Dropbox/
书签跟别名的区别在于,它们会被自动持久化。
译注13:之前已经说过,作者用的不是Windows操作系统,所以这个命令自然无法执行。Windows上可以用ipconfig,但毕竟不是一样东西,这里的代码自己能看明白即可。
译注14:在Windows中,将ls换成dir。