重要

本文档介绍 IPython 6.0 及更高版本。从 6.0 版本开始,IPython 不再支持与低于 Python 3.3 的 Python 版本(包括所有版本的 Python 2.7)兼容。

如果您正在寻找与 Python 2.7 兼容的 IPython 版本,请使用 IPython 5.x LTS 版本并参阅其文档(LTS 是长期支持版本)。

注意

此页面已保留以供历史参考。您很可能希望使用 Xonsh 而不是此页面。

IPython 作为系统 shell

概述

可以调整 IPython 以用于系统 shell。过去,IPython 为此目的提供了一个特殊的“sh”配置文件,但自 0.11 版本以来已将其隔离,并在 1.0 版本中将其完全删除。不过,本节的大部分内容都依赖于不需要自定义配置文件的机制。

您可以设置自己的“sh” 配置文件,使其不同于默认配置文件,例如

  • 提示符显示当前目录(请参阅 提示符自定义

  • 通过运行 %rehashx 魔术命令,使系统命令直接可用(在别名表中)。如果您在 PATH 中安装了新程序,您可能需要运行 %rehashx 来更新别名表

  • %autocall 转换为完全模式

环境变量

您可以使用魔术 %env 命令,而不是直接操作 os.environ。如果没有参数,这将显示所有环境变量和值。要获取特定变量的值,请使用 %env var。要设置特定变量的值,请使用 %env foo bar%env foo=bar。默认情况下,值被认为是字符串,因此无需引用它们。但是,Python 变量在魔术命令中照常展开,因此 %env foo=$bar 表示“将环境变量 foo 设置为 Python 变量 bar 的值”。

别名

一旦您运行 %rehashx,您的所有 $PATH 都已作为 IPython 别名加载,因此您应该能够键入任何正常的系统命令并执行它。有关别名工具的详细信息,请参阅 %alias?%unalias?。有关用于加载 $PATH 的机制的详细信息,请参阅 %rehashx?

警告

请参阅页面顶部的信息。您很可能希望使用 Xonsh 而非此项。

目录管理

由于 IPython 传递给底层系统的每个命令都在立即退出的子 shell 中执行,因此您不能使用 !cd 浏览文件系统。

IPython 提供自己的内置 %cd 魔术命令在文件系统中移动(当自动魔法开启时,不需要 %)。它还维护一个已访问目录列表(使用 %dhist 查看),并允许直接切换到其中任何一个目录。键入 cd? 了解更多详情。

%pushd%popd%dirs 用于目录堆栈处理。

提示符自定义

请参阅 自定义提示符

字符串列表

字符串列表 (IPython.utils.text.SList) 是处理系统命令输出的便捷方式。它们由 var = !cmd 语法生成。

首先,我们获取“ls -l”的输出

[Q:doc/examples]|2> lines = !ls -l
 ==
['total 23',
 '-rw-rw-rw- 1 ville None 1163 Sep 30  2006 example-demo.py',
 '-rw-rw-rw- 1 ville None 1927 Sep 30  2006 example-embed-short.py',
 '-rwxrwxrwx 1 ville None 4606 Sep  1 17:15 example-embed.py',
 '-rwxrwxrwx 1 ville None 1017 Sep 30  2006 example-gnuplot.py',
 '-rwxrwxrwx 1 ville None  339 Jun 11 18:01 extension.py',
 '-rwxrwxrwx 1 ville None  113 Dec 20  2006 seteditor.py',
 '-rwxrwxrwx 1 ville None  245 Dec 12  2006 seteditor.pyc']

现在,我们来看一下“lines”的内容(第一个数字是列表元素编号)

[Q:doc/examples]|3> lines
                <3> SList (.p, .n, .l, .s, .grep(), .fields() available). Value:

0: total 23
1: -rw-rw-rw- 1 ville None 1163 Sep 30  2006 example-demo.py
2: -rw-rw-rw- 1 ville None 1927 Sep 30  2006 example-embed-short.py
3: -rwxrwxrwx 1 ville None 4606 Sep  1 17:15 example-embed.py
4: -rwxrwxrwx 1 ville None 1017 Sep 30  2006 example-gnuplot.py
5: -rwxrwxrwx 1 ville None  339 Jun 11 18:01 extension.py
6: -rwxrwxrwx 1 ville None  113 Dec 20  2006 seteditor.py
7: -rwxrwxrwx 1 ville None  245 Dec 12  2006 seteditor.pyc

现在,我们过滤掉“embed”行

[Q:doc/examples]|4> l2 = lines.grep('embed',prune=1)
[Q:doc/examples]|5> l2
                <5> SList (.p, .n, .l, .s, .grep(), .fields() available). Value:

0: total 23
1: -rw-rw-rw- 1 ville None 1163 Sep 30  2006 example-demo.py
2: -rwxrwxrwx 1 ville None 1017 Sep 30  2006 example-gnuplot.py
3: -rwxrwxrwx 1 ville None  339 Jun 11 18:01 extension.py
4: -rwxrwxrwx 1 ville None  113 Dec 20  2006 seteditor.py
5: -rwxrwxrwx 1 ville None  245 Dec 12  2006 seteditor.pyc

现在,我们想要具有文件名和权限的字符串

[Q:doc/examples]|6> l2.fields(8,0)
                <6> SList (.p, .n, .l, .s, .grep(), .fields() available). Value:

0: total
1: example-demo.py -rw-rw-rw-
2: example-gnuplot.py -rwxrwxrwx
3: extension.py -rwxrwxrwx
4: seteditor.py -rwxrwxrwx
5: seteditor.pyc -rwxrwxrwx

请注意,带有“total”的行不会引发 IndexError。

如果您想将这些字符串拆分(生成列表),请在不带参数的情况下调用 fields()

[Q:doc/examples]|7> _.fields()
                <7>
[['total'],
 ['example-demo.py', '-rw-rw-rw-'],
 ['example-gnuplot.py', '-rwxrwxrwx'],
 ['extension.py', '-rwxrwxrwx'],
 ['seteditor.py', '-rwxrwxrwx'],
 ['seteditor.pyc', '-rwxrwxrwx']]

如果您想使用空格将这些字符串传递给命令(对于文件列表来说很典型),请使用 .s 属性

[Q:doc/examples]|13> files = l2.fields(8).s
[Q:doc/examples]|14> files
                <14> 'example-demo.py example-gnuplot.py extension.py seteditor.py seteditor.pyc'
[Q:doc/examples]|15> ls $files
example-demo.py  example-gnuplot.py  extension.py  seteditor.py  seteditor.pyc

SList 继承自普通 Python 列表,因此可以使用每种列表方法

[Q:doc/examples]|21> lines.append('hey')

现实世界示例:删除版本控制之外的所有文件

首先,捕获“hg status”的输出

[Q:/ipython]|28> out = !hg status
 ==
['M IPython\\extensions\\ipy_kitcfg.py',
 'M IPython\\extensions\\ipy_rehashdir.py',
...
 '? build\\lib\\IPython\\Debugger.py',
 '? build\\lib\\IPython\\extensions\\InterpreterExec.py',
 '? build\\lib\\IPython\\extensions\\InterpreterPasteInput.py',
...

(以 ? 开头的行不在版本控制之下)。

[Q:/ipython]|35> junk = out.grep(r'^\?').fields(1)
[Q:/ipython]|36> junk
            <36> SList (.p, .n, .l, .s, .grep(), .fields() availab
...
10: build\bdist.win32\winexe\temp\_ctypes.py
11: build\bdist.win32\winexe\temp\_hashlib.py
12: build\bdist.win32\winexe\temp\_socket.py

现在,我们可以通过执行“rm $junk.s”来删除这些文件。

.n、.s、.p 属性

SList 包装器的属性提供了使用不同格式的包含文本的便捷方式

  • .n 返回(原始)字符串,其中各行由换行符分隔

  • .s 返回字符串,其中各行由单个空格分隔(便于传递给系统命令)

  • .p 返回从检测到的文件名生成的“路径”对象列表

错误

您滚动得太远了,请返回。您很可能希望使用 Xonsh 而非此项。