用!可以连接IPython和系统命令。
Shell例子
比如这有一个Linux/OSX界面,是一个用户探索、创建和修改其系统上的目录和文件的例子,
osx:~ $是提示符,其后跟的是命令行,#后面是注释:
osx:~ $ echo "hello world" # echo is like Python's print function
hello world
osx:~ $ pwd # pwd = print working directory
/home/jake # this is the "path" that we're sitting in
osx:~ $ ls # ls = list working directory contents
notebooks projects
osx:~ $ cd projects/ # cd = change directory
osx:projects $ pwd
/home/jake/projects
osx:projects $ ls
datasci_book mpld3 myproject.txt
osx:projects $ mkdir myproject # mkdir = make new directory
osx:projects $ cd myproject/
osx:myproject $ mv ../myproject.txt ./ # mv = move file. Here we're moving the
# file myproject.txt from one directory
# up (../) to the current directory (./)
osx:myproject $ ls
myproject.txt
在IPython里运行Shell命令
加个前缀!就可以实现在IPython里运行Shell命令
In [1]: !ls
myproject.txt
In [2]: !pwd
/home/jake/projects/myproject
In [3]: !echo "printing from the shell"
printing from the shell
从Shell接收value
比如可以用赋值命令存入shell命令的输出:
In [4]: contents = !ls
In [5]: print(contents)
['myproject.txt']
In [6]: directory = !pwd
In [7]: print(directory)
['/Users/jakevdp/notebooks/tmp/myproject']
注意上面返回的结果不是list格式,而是一种IPython定义的特殊格式
In [8]: type(directory)
IPython.utils.text.SList
这格式看起来和行为很像Python列表,但具有额外的功能,例如 grep 和 fields 方法以及 s、n 和 p 属性,允许你以方便的方式搜索、过滤和显示结果。想了解更多可以查看IPython内置help文档。
给Shell传递value
从Python传递变量给shell可以用{varname}
In [9]: message = "hello from Python"
In [10]: !echo {message}
hello from Python
括号包含变量名,它在 shell 命令中被变量的内容替换。
Shell相关magic命令
如果你在IPython里用过一段时间shell命令你会发现 !cd 命令不起作用。
In [11]: !pwd
/home/jake/projects/myproject
In [12]: !cd ..
In [13]: !pwd
/home/jake/projects/myproject
原因是笔记本中的 shell 命令是在临时子 shell 中执行的。如果您想以更持久的方式更改工作目录,可以用magic命令%cd:
In [14]: %cd ..
/home/jake/projects
甚至你还可以省略%:
In [15]: cd myproject
/home/jake/projects/myproject
这种也叫automagic命令,想查看其他此类命令,这些命令可以和%automagic命令切换。
其他shell相关命令还有%cat, %cp, %env, %ls, %man, %mkdir, %more, %mv, %pwd, %rm, 以及%rmdir,这些也可以省略%。
In [16]: mkdir tmp
In [17]: ls
myproject.txt tmp/
In [18]: cp myproject.txt tmp/
In [19]: ls tmp
myproject.txt
In [20]: rm -r tmp
这种从与 Python 会话相同的终端窗口中访问 shell 的方式,意味着在编写 Python 代码时在编译器和 shell 之间来回切换的次数要少得多。