B.2 与操作系统交互

IPython的另一个功能是无缝连接文件系统和操作系统。这意味着,在同时做其它事时,无需退出IPython,就可以像Windows或Unix使用命令行操作,包括shell命令、更改目录、用Python对象(列表或字符串)存储结果。它还有简单的命令别名和目录书签功能。

表B-1总结了调用shell命令的魔术函数和语法。我会在下面几节介绍这些功能。

表B-1 IPython系统相关命令

Shell命令和别名

用叹号开始一行,是告诉IPython执行叹号后面的所有内容。这意味着你可以删除文件(取决于操作系统,用rm或del)、改变目录或执行任何其他命令。

通过给变量加上叹号,你可以在一个变量中存储命令的控制台输出。例如,在我联网的基于Linux的主机上,我可以获得IP地址为Python变量:

  1. In [1]: ip_info = !ifconfig wlan0 | grep "inet "
  2. In [2]: ip_info[0].strip()
  3. Out[2]: 'inet addr:10.0.0.11 Bcast:10.0.0.255 Mask:255.255.255.0'

返回的Python对象ip_info实际上是一个自定义的列表类型,它包含着多种版本的控制台输出。

当使用!,IPython还可以替换定义在当前环境的Python值。要这么做,可以在变量名前面加上$符号:

  1. In [3]: foo = 'test*'
  2. In [4]: !ls $foo
  3. test4.py test.py test.xml

%alias魔术函数可以自定义shell命令的快捷方式。看一个简单的例子:

  1. In [1]: %alias ll ls -l
  2. In [2]: ll /usr
  3. total 332
  4. drwxr-xr-x 2 root root 69632 2012-01-29 20:36 bin/
  5. drwxr-xr-x 2 root root 4096 2010-08-23 12:05 games/
  6. drwxr-xr-x 123 root root 20480 2011-12-26 18:08 include/
  7. drwxr-xr-x 265 root root 126976 2012-01-29 20:36 lib/
  8. drwxr-xr-x 44 root root 69632 2011-12-26 18:08 lib32/
  9. lrwxrwxrwx 1 root root 3 2010-08-23 16:02 lib64 -> lib/
  10. drwxr-xr-x 15 root root 4096 2011-10-13 19:03 local/
  11. drwxr-xr-x 2 root root 12288 2012-01-12 09:32 sbin/
  12. drwxr-xr-x 387 root root 12288 2011-11-04 22:53 share/
  13. drwxrwsr-x 24 root src 4096 2011-07-17 18:38 src/

你可以执行多个命令,就像在命令行中一样,只需用分号隔开:

  1. In [558]: %alias test_alias (cd examples; ls; cd ..)
  2. In [559]: test_alias
  3. macrodata.csv spx.csv tips.csv

当session结束,你定义的别名就会失效。要创建恒久的别名,需要使用配置。

目录书签系统

IPython有一个简单的目录书签系统,可以让你保存常用目录的别名,这样在跳来跳去的时候会非常方便。例如,假设你想创建一个书签,指向本书的补充内容:

  1. In [6]: %bookmark py4da /home/wesm/code/pydata-book

这么做之后,当使用%cd魔术命令,就可以使用定义的书签:

  1. In [7]: cd py4da
  2. (bookmark:py4da) -> /home/wesm/code/pydata-book
  3. /home/wesm/code/pydata-book

如果书签的名字,与当前工作目录的一个目录重名,你可以使用-b标志来覆写,使用书签的位置。使用%bookmark的-l选项,可以列出所有的书签:

  1. In [8]: %bookmark -l
  2. Current bookmarks:
  3. py4da -> /home/wesm/code/pydata-book-source

书签,和别名不同,在session之间是保持的。