容器是全机器虚拟化的替代方法。它是轻量级的虚拟化方法,内核与操作系统允许运

行多个隔离的用户空间实例。容器和主机之间共享操作系统(OS),因此从理论上来说,

这种方法的开销比完全虚拟化要少。这样的容器只包含应用程序代码和系统级的依赖,但

从内部运行进程的角度来看,它看起来像一个完全隔离的系统环境。

软件容器之所以流行,主要是因为 Docker,这是容器的可用实现之一。Docker 可以用

名为 Dockerfile 的简单文本文件的形式来描述其容器。可以创建并存储这样定义的容

器。它还支持增量修改,如果向容器中添加了新的内容,无需从头重新创建。

像 Docker 和 Vagrant 这样不同的工具在功能上似乎有所交叉,但二者主要的区别在于

构建这些工具的原因。如前所述,构建 Vagrant 主要用作开发工具。用一行命令就可以引导

启动整个虚拟机,但无法原样打包并部署或发布。另一方面,Docker 正是为此而创建的,

可以将整个容器打包,发送到生产环境中并部署。如果顺利实现的话,这可以大大改进产

品部署的过程。因此,只有 Docker 和类似的解决方案(例如 Rocket)还要用于生产环境的

部署过程时,在开发过程中使用这些方法才是有意义的。将 Docker 仅用于开发过程的隔离,

可能会产生过大开销,还会有不一致的缺点。

常用的生产力工具

生产力工具是一个模糊的术语。一方面,几乎所有在线发布的开源代码包都是一种生

产力提升工具。它们为某些问题提供了现成的解决方案,因此人们不必再浪费时间(理想

情况下)。另一方面,可以说整个 Python 都是关于生产力的。两种说法都没有错。Python

这种语言的一切及其社区几乎都是为了尽可能高效地开发软件而设计的。

这就建立了一个正反馈循环。由于写代码简单又有趣,所以很多程序员用空闲时间创

建工具,使写代码变得更加简单更加有趣。基于这一事实,这里为生产力工具给出一个非

常主观而且不科学的定义:使开发过程更加简单、更加有趣的一款软件。

从定义来看,生产力工具主要关注开发过程中的某些特定环节,例如测试、调试和包

管理,并不是所构建产品的核心部分。在某些情况下,虽然每天都会用到这些工具,但它

们甚至不会出现在项目的代码库中。

最重要的生产力工具是 pip 和 venv,本章前面已经讨论过了。有些生产力工具可以

解决特定的问题(如分析和测试),本书有专门的章节来介绍。本节主要介绍一些其他章节

没有提到而又十分值得推荐的工具。

自定义 Python shell—IPython、bpython、ptpython 等

Python 程序员在交互式解释器会话上花费了大量时间。它非常适合测试短代码片段、

访问文档、甚至在运行时调试代码。默认的 Python 交互式会话非常简单,并没有类似 tab

补全或代码内省助手(code introspection helper)的许多功能。幸运的是,对默认 Python shell

的扩展和定制是非常简单的。

用一个启动文件就可以配置交互式提示符。Python 在启动时会寻找 PYTHONSTARTUP

环境变量,并执行这一变量指向的文件中的代码。有些 Linux 发行版提供了默认的启动脚

本,一般位于主目录中,名为.pythonstartup。通常会提供 tab 补全功能和命令历史记

录来加强提示符,这些功能是基于 readline 模块。(你需要安装 readline 库)。

如果你没有这样的文件,创建一个也很容易。下面是最简单的启动文件示例,添加了

键补全功能和显示历史记录:

# python 启动文件

import readline

import rlcompleter

import atexit

import os

# tab 补全

readline.parse_and_bind('tab: complete')

# 历史记录

histfile = os.path.join(os.environ['HOME'], '.pythonhistory')

try:

readline.read_history_file(histfile)

except IOError:

pass

atexit.register(readline.write_history_file, histfile)

del os, histfile, readline, rlcompleter

在主目录中创建这个文件并命名为 .pythonstartup 。然后在环境中添加

PYTHONSTARTUP 变量,其值为该文件的路径。

1.设置 PYTHONSTARTUP 环境变量

如果你用的是 Linux 或 MAC OS X 系统,最简单的方法就是在主文件夹中创建启动脚

本。然后将它与系统 shell 启动脚本中的 PYTHONSTARTUP 环境变量链接在一起。举个例

子,Bash 和 Korn shell 用的都是.profile 文件,你可以在里面插入这样一行:

export PYTHONSTARTUP=~/.pythonstartup

如果你用的是 Windows,做法也很简单:以管理员身份在系统首选项中设置新的环境

变量,然后将脚本保存在常用文件夹,不要使用特定的用户文件夹。

编写 PYTHONSTARTUP 脚本可能是一项很好的练习,但独自创建优秀的自定义 shell

却是一项很少人有时间完成的挑战。幸运的是,已经有一些自定义 Python shell 的实现,可

以极大地提高 Python 交互式会话的体验。

2.IPython

IPython 提供了一个扩展的 Python 命令行 shell。它的功能很多,其中最有趣的功能如

下所示。

• 动态对象自省。

• 在提示符中访问系统 shell。

• 支持直接分析。

• 方便调试。

现在,IPython 已经成为大型项目 Jupyter 的一部分,该项目提供了实时代码的交互式

notebook,支持多种不同的语言。

3.bpython

bpython 自称 Python 解释器的优秀界面。下面是项目主页上重点强调的一些功能,如

下所示。

• 内联语法高亮。

• 类似 Readline 的自动补全,在你输入时会显示建议。

• 对任何 Python 函数都有预期参数列表。

• 自动缩进。

• 支持 Python 3。

4.ptpython

ptpython 是另一款高级的 Python shell。在这个项目中,核心提示符应用的实现是一个

叫作 prompt_toolkit 的独立包(来自同一作者)。这样你可以轻松创建各种美观的交互

式命令行界面。

通常会将 ptpython 与 bpython 在功能上进行比较,但主要区别在于,ptpython 能够与

IPython 及其某些语法兼容,利用这些语法可以实现一些附加功能,例如%pdb、%cpaste

或%profile。