4340_python.txt
Edited: Thursday 1 May 2025

1.8 应 用 层 Python 环 境 隔 离

Requirement atready satisfied (use

–upgrade to upgrade) : SsetuptooLSs in

/ usr/1Lib/python2 . 7/site-

packages CoLlecting pip

Instalting collected packages: pip

SuccessfutLy instaLlted pip-6.1.1

关 于 在 旧 版 Python 中 如 何 安 装 pip 的

方 法 , 访 问 项 目 的 文 档 页 面 可 获 取 最

亲斤信息 O 〇

1.8.1 为 什 么 要 隔 离

pip 可 用 于 安 装 系 统 级 的 Python 包 。

在 基 于 Unix 的 系 统 和 Linux 系 统 上 , 这

么 做 需 要 超 级 用 户 权 限 , 所 以 实 际 的

调 用 如 下 所 示 :

注 意 , 在 Windows 上 并 不 需 要 这 样
81/1 1299
1.8 应 用 层 Python 环 境 隔 离
做 , 因 为 没 有 默 认 安 装 Python 解 释
器 ,Windows 上 的 Python 通 常 由 用 尸
手 动 安 装 , 无 需 超 级 用 户 权 限 。
无 论 如 何 , 不 推 荐 直 接 从 PyPI 安 装 系
统 级 的 Python 包 , 也 应 尽 量 避 免 这 一
做 法 。 前 面 说 PyPA 推 荐 使 用 pip, 这
似 乎 与 前 面 的 说 法 相 矛 眉 , 但 其 中 是
有 很 重 要 的 原 因 。 如 前 所 述 , 通 过 操
作 系 统 软 件 包 仓 库 ,Python 往 往 是 许
多 软 件 包 的 重 要 组 成 部 分 , 也 可 以 提
供 许 多 重 要 服 务 。 系 统 发 行 版 的 维 护
者 投 入 大 量 精 力 选 择 合 适 的 软 件 包 版
本 , 以 匹 配 各 种 包 依 赖 。 通 常 来 说 ,
系 统 软 件 包 仓 库 中 的 Python 包 都 包 吾
自 定 义 补 丁 , 或 者 使 用 较 旧 的 版 本 ,
只 是 为 了 保 证 与 其 他 系 统 组 件 的 兼
容 。 利 用 pip 将 这 些 Python 包 强 制 更
新 至 某 一 版 本 , 打 破 了 向 后 兼 容 , 也
82 1 1299
1.8 应 用 层 Python 环 境 隔 离
可 能 会 破 坏 某 些 关 键 的 系 统 服 务 。
即 使 在 本 地 计 算 机 上 , 为 了 方 便 开 发
而 做 这 些 事 情 也 不 是 一 个 好 的 理 由 。
那 样 胡 乱 使 用 pip 几 乎 总 会 引 起 麻 烦 ,
最 终 导 致 难 以 调 试 的 问 题 。 井 不 是 说
要 严 格 禁 止 从 PyPI 全 局 安 装 Python
包 , 但 这 么 做 时 一 定 要 清 楚 地 认 识 到
相 关 风 险 。
幸 运 的 是 , 这 个 问 题 有 一 个 简 单 的 解
决 方 案 , 就 是 环 境 隔 离 。 在 不 同 的 系
统 抽 象 层 中 对 Python 运 行 环 境 进 行 隔
离 的 工 具 有 很 多 种 。 其 主 要 作 用 是 ,
将 项 目 依 赖 与 其 他 项 目 和 / 或 系 统 服 务
需 要 的 包 进 行 隔 离 。 这 种 方 法 的 好 处
在 于 以 下 几 个 方 面 。

  • 解 决 了 这 样 的 难 题 : “X 项 目 依

赖 于 1.x 版 , 但 Y 项 目 却 需 要 4.x

83 / 1299
1.8 应 用 层 Python 环 境 隔 离
版 “ 。 开 发 人 员 可 以 同 时 开 发 多
个 项 目 , 这 些 项 目 的 依 赖 不 同 ,
甚 至 可 能 相 上 冲 突 , 但 项 目 之 间
却 不 会 相 互 影 响 。
。 项 目 不 再 受 限 于 系 统 发 行 版 仓
库 中 包 的 版 本 。
。 不 会 破 坏 依 赖 特 定 包 版 本 的 其
他 系 统 服 务 , 因 为 新 版 软 件 包 只
存 在 于 隔 离 环 境 内 部 。
。 项 目 依 赖 的 包 列 表 可 以 轻 松 锁
定 (frozen) “, 复 制 起 来 也 很 容
易 。
隔 离 最 简 单 也 最 轻 便 的 方 法 就 是 使 用
应 用 层 的 虚 拟 环 境 。 它 们 仅 隔 离
Python 解 释 器 和 其 中 可 用 的 Python
包 。 其 设 置 非 常 简 单 , 通 常 也 足 以 保
84 1 1299
1.8 应 用 层 Python 环 境 隔 离
证 小 项 目 和 小 软 件 包 开 发 过 程 中 的 隔
离 。
不 幸 的 是 , 在 某 些 情 况 下 , 这 种 做 法
可 能 不 足 以 保 证 充 分 的 一 致 性 和 可 重
复 性 。 对 于 这 种 情 况 , 系 统 级 隔 离 是
对 工 作 流 程 很 好 的 补 充 , 本 章 后 面 也
会 介 绍 一 些 可 用 的 方 案 。
1.8.2 帕 用 解 决 一 栾
在 运 行 时 隔 离 Python 的 方 法 有 几 种 。
最 简 单 也 最 显 而 易 见 的 方 法 , 就 是 手
动 修 改 PATH 和 PYTHONPATH 环 境 变
量 或 将 Python 二 进 制 文 件 移 动 到 其 他
位 置 , 以 改 变 它 发 现 可 用 Python 包 的
方 式 , 将 环 境 变 量 修 改 成 保 存 项 目 依
赖 的 自 定 义 位 置 , 当 然 这 种 方 法 也 最
隼 维 护 。 幸 运 的 是 , 有 几 种 工 具 可 以
帮 助 维 护 虚 拟 环 境 , 并 维 护 系 统 中 安
85 1 1299
1.8 应 用 层 Python 环 境 隔 离
装 包 的 存 储 方 式 。 这 些 工 具 主 要 包
…_:舌: virtualenv、 Ver】V禾口t〕[′i(二】O[′__二〔】 ‘`_三′’
们 在 底 层 做 的 事 情 实 际 上 与 我 们 手 动
做 的 一 样 。 实 际 的 策 略 取 决 于 具 体 的
工 具 实 现 。 但 一 般 来 说 , 它 们 更 方 便
使 用 , 而 东 还 有 其 他 好 处 。

  1. Vvirtualenv
    在 这 个 工 具 列 表 中 ,virtualenv 是 目 前
    最 常 用 的 工 具 。 它 名 字 的 含 义 就 是 虚
    拟环境 M忱ua| 抓V廿Onment) eo 它
    并 不 是 Python 标 准 发 行 版 的 一 部 分 ,
    所 以 需 要 用 pip 来 获 取 。 它 也 是 值 得 在
    系 统 层 面 安 装 的 Python 包 之 一 ( 在
    Linux 系 统 和 基 于 Unix 的 系 统 中 要 用 到
    S[′_〔jO〉 o
    安 装 完 成 后 , 利 用 下 面 的 命 令 可 以 创
    建 一 个 新 的 虚 拟 环 境 :

86 / 1299
1.8 应 用 层 Python 环 境 隔 离
这 里 的 ENV 应 替 换 为 新 环 境 的 名 字 。
这 将 在 当 前 工 作 目 录 路 径 中 创 建 一 个
新 的 ENV 目 录 。 里 面 包 含 以 下 几 个 新
目 录 。
。 bin/ : 里 面 包 含 新 的 Python 可
执 行 文 件 和 其 他 包 提 供 的 脚 本 / 可
执 行 文 件 。
。 lib/ 和 include/ : 这 些 目 录 包 含
虚 拟 环 境 中 新 Python 的 支 持 库 文
件 。 新 的 Python 包 将 会 安 装 在
ENV/Iib/pythonX.Y/site -
packages/ 中 。
创 建 好 新 环 境 后 , 需 要 用 Unix 的
source 命 令 在 当 前 shell 会 话 中 激 活
87 1299
1.8 应 用 层 Python 环 境 隔 离

它 :

| source ENV/bin/activate |

这 将 会 影 响 环 境 变 量 , 从 而 改 变 当 前

shell 会 话 的 状 态 。 为 了 告 知 用 户 已 经

激 活 了 虚 拟 环 境 ,shell 提 示 符 会 在 开

头 增 加 (ENV) 字 符 串 。 下 面 举 个 例

子 , 在 会 话 中 创 建 一 个 新 环 境 并 激

活 :

$ virtualenv examptLe New

python executable in example/ybiny

python Instalting setuptoots,

pip ,whee1. . .done . $ source

examplLe/ybin/activate

(exampLe)\(deactivate\)

关 于 virtualenv 要 注 意 , 最 重 要 的 是 它

完 全 依 赖 于 在 文 件 系 统 中 的 存 储 状

态 。 它 不 会 提 供 额 外 功 能 来 跟 踪 应 议
88 1 1299
1.8 应 用 层 Python 环 境 隔 离

安 装 哪 些 包 。 这 些 虚 拟 环 境 不 可 移
植 , 不 能 移 动 到 其 他 系 统 或 机 器 。 对
每 个 新 的 应 用 部 署 来 说 , 都 需 要 从 头
开 始 创 建 新 的 虚 拟 环 境 。 因 此 ,
virtualenv 用 户 有 一 个 艮 好 实 践 , 就 是
将 所 有 项 目 依 赖 保 存 到 一 个
requirements.txt 文 件 ( 约 定 命 名 )
中 , 正 如 下 面 的 代 码 所 示 :

江 井 号 (#) 后 面 的 内 容 是 注 释 。

江 明 确 版 本 号 , 可 重 复 性 高 。

eventlLet==0 ,17.4

graceful==80.1.1

江 如 果 项 目 在 不 同 依 赖 版 本 中 都 通 过 测 试 ,

江 也 可 以 指 定 相 对 版 本 编 号 。
faLcon>=8.3.0,<80.5.0

应 尽 量 明 确 Python 包 的 版 本 ,

江 除 非 始 终 需 要 最 新 版 。

pytz

有 了 这 个 文 件 , 用 pip 就 可 以 轻 松 安 装

89 1 1299
1.8 应 用 层 Python 环 境 隔 离
所 有 依 赖 , 因 为 它 可 以 接 受 需 求 文 件
作 为 参 数 :
需 要 记 住 , 需 求 文 件 并 不 总 是 理 想 的
解 决 方 案 , 因 为 已 没 有 给 定 依 赖 的 准
确 列 表 , 而 只 给 出 了 需 要 安 装 的 依
赖 。 因 此 , 如 果 需 求 文 件 并 非 最 新
版 , 无 法 反 映 环 境 的 实 际 状 态 , 那 么
整 个 项 目 在 开 发 环 境 中 可 以 正 常 运
行 , 但 在 其 他 环 境 中 却 无 法 启 动 。 当
然 ,pip _freeze 命 令 可 以 打 印 出 当 前
环 境 所 有 的 Python 包 , 但 不 应 该 盲 目
使 用 这 个 命 令 。 它 会 打 印 出 所 有 内
容 , 甚 至 那 些 仅 用 于 测 试 而 并 不 用 于
项 目 的 Python 包 。 本 书 提 到 的 另 一 款
工 具 buildout 就 解 决 了 这 个 问 题 , 所
以 可 能 是 某 些 开 发 团 队 的 更 佳 选 择 。
90 1 1299
1.8 应 用 层 Python 环 境 隔 离

对 于 Windqows 用 户 来 说 ,Windows

下 的 virtualenv 对 内 部 目 录 结 构 使 用

了 一 种 不 同 的 命 名 方 式 。 你 要 用

Scripts/、Libs/ 和 Incluqe/3 个 目 录 ,

而 不 是 bin/x 、 1ib/ 和 incluqde/ , 以 更

好 地 匹 配 这 种 操 作 系 统 上 的 开 发 约

定 。 用 于 激 活 / 关 闭 环 境 的 命 令 也

不 一 样 。 你 要 用 ENV/S5cripts/

activate.bat 和 ENYV/5cripts/

qeactivate.bat, 而 不 是 将 source 命

令 作 用 在 activate 和 qeactivate 脚 本

上 。

2.venv

虚 拟 环 境 很 快 逐 步 完 善 , 成 为 了 社 区

中 的 常 用 工 具 。 从 Python 3.3 开 始 ,

标 准 库 已 经 支 持 创 建 虚 拟 环 境 。 其 用
9111299
1.8 应 用 层 Python 环 境 隔 离
法 与 Virtualenv 几 乎 相 同 , 虽 然 命 令
行 选 项 采 用 了 不 同 的 命 名 约 定 。 新 的
venv 模 块 提 供 了 pyvenv 脚 本 , 可 以 用
于 创 建 新 的 虚 拟 环 境 :
这 里 的 ENV 应 替 换 为 新 环 境 的 名 字 。
此 外 , 现 在 也 可 以 用 Python 代 码 直 接
创 建 新 的 环 境 , 囚 为 所 有 功 能 都 包 含
在 内 置 的 venv 模 块 中 。 其 他 用 法 和 实
现 细 节 ( 例 如 环 境 目 录 的 结 构 、 激 活 /
关 闭 脚 本 ) 与 Virtualenv 几 乎 完 全 相
同 , 所 以 换 用 这 种 方 法 应 该 很 简 单 ,
也 不 会 牲 扯 太 多 精 力 。
对 于 使 用 较 新 版 本 Python 的 开 发 人 员
来 说 , 推 荐 使 用 venv 而 不 是 Vir -
tualenv。 对 于 Python 3.3 版 , 切 换 到
92 1 1299
1.8 应 用 层 Python 环 境 隔 离
venv 可 能 需 要 付 出 更 多 的 精 力 , 囚 为
这 一 版 本 在 新 环 境 中 没 有 默 认 安 装
setuptools 和 pip, 所 以 用 户 需 要 手 动
安 装 已 们 。 幸 运 的 是 , 这 一 点 在
Python 3.4 中 已 经 修 改 , 并 且 由 于
venv 的 可 定 制 性 , 其 内 容 可 以 被 改
与 。 对 于 细 节 的 解 释 可 参 见 Python 女
档 , 但 有 些 用 户 可 能 会 认 为 它 过 于 复
杂 , 仍 然 在 这 一 版 本 的 Python 中 继 绩

使 用 Virtualenv。

3.,buildout
buildout 是 一 个 强 大 工 具 , 可 与 引 导
启 动 并 部 署 用 Python 编 写 的 应 用 。 它
的 一 些 高 级 特 性 将 在 本 书 后 面 讲 到 。
在 很 长 一 段 时 间 内 , 他 还 被 用 作 创 建
Python 隔 离 环 境 的 工 具 。 由 于
buildout 需 要 声 明 性 的 配 置 , 每 次 依
赖 发 生 变 化 都 必 须 修 改 配 置 , 因 此 这
93 1 1299
1.8 应 用 层 Python 环 境 隔 离
些 环 境 更 容 易 复 制 和 管 理 , 无 需 依 赖
环 境 状 态 。
不 幸 的 是 , 这 一 情 况 已 发 生 变 化 。 从
2.0.0 版 开 始 ,buildout 包 不 再 提 供 与
系 统 Python 在 任 何 层 级 的 隔 离 。 处 理
隔 离 的 任 务 留 给 其 他 工 具 来 做 , 如
virtualenv, 所 以 仍 然 可 以 用 buildout
来 做 隔 离 , 但 事 情 变 得 有 点 复 杂 。
buildout 必 须 要 在 隔 离 环 境 中 初 始 化
才 能 真 正 隔 禽 。
与 之 前 版 本 的 buildout 相 比 , 这 一 版
本 有 一 个 主 要 缺 点 , 就 是 它 要 依 赖 其
他 隔 离 方 法 。 开 发 这 些 代 码 的 开 发 人
员 不 再 确 定 对 依 赖 的 描 述 是 否 完 整
因 为 有 些 Python 包 可 以 绕 过 声 明 性 配
置 来 安 装 。 当 然 , 这 个 问 题 可 以 通 过
适 当 的 测 试 和 发 布 过 程 来 解 决 , 但 却
94 1 1299
1.8 应 用 层 Python 环 境 隔 离

使 整 个 工 作 流 程 更 加 复 杂 。

总 而 言 之 ,buildout 不 再 是 提 供 环 境

隔 离 的 解 决 方 案 , 但 其 声 明 性 配 置 可

以 提 高 虚 拟 环 境 的 可 维 护 性 和 可 重 复

性 。

1.8.3 选 择 哪 种 工 具

不 存 在 适 用 于 所 有 情 况 的 最 佳 解 决 方

案 。 一 家 公 司 认 为 好 的 解 决 方 案 可 能

幸 不 适 用 于 其 他 团 队 的 工 作 流 程 。 而

且 每 个 应 用 的 需 求 也 各 不 相 同 。 小 项

目 可 以 只 使 用 virtualenv 或 venv, 比 较

简 单 , 但 大 型 项 目 可 能 还 需 要

buildout 的 帮 助 , 以 便 进 行 更 复 杂 的

装 配 。

之 前 没 有 详 细 说 明 的 是 , 在 buildout

早 期 版 本 (2.0.0 版 之 前 ) 中 , 可 以 在
95 1 1299
1.8 应 用 层 Python 环 境 隔 离
隔 离 环 境 中 对 项 目 进 行 装 配 , 其 结 果
与 Virtualenv 给 出 的 结 果 类 似 。 不 幸
的 是 , 这 个 项 目 的 1.x 分 支 不 再 受 到 维
护 , 所 以 不 建 议 因 为 这 个 原 因 使 用
已 。
我 推 荐 尽 可 能 使 用 venv 模 块 , 而 不 是
virtualenv 。 因 此 , 对 于 面 向 Python
3.4 或 更 高 版 本 的 项 目 , 应 该 默 认 选 择
venv。 在 Python 3.3 中 使 用 venv 可 能
不 太 方 便 , 因 为 没 有 内 置 setuptools
和 pip 的 支 持 。 对 于 面 向 更 多 Python
版 本 ( 包 括 其 他 解 释 器 和 2.x 分 支 ) 的
项 目 ,virtualenv 似 乎 是 最 佳 选 择 。
96 / 1299
‖1.9 系 统 级 环 境 隔 离
在 大 多 数 情 况 下 , 软 件 实 现 之 所 以 可
以 快 速 迭 代 , 是 因 为 开 发 人 员 复 用 了
大 量 现 有 组 件 。 不 要 重 复 你 自 己
(Dont Repeat Yourself) , 这 已 经
成 为 许 多 程 序 员 的 通 用 准 则 和 座 右
铭 。 将 其 他 包 和 模 块 用 在 代 码 库 中 只
是 这 种 文 化 的 一 部 分 。 二 进 制 库 、 数
据 库 、 系 统 服 务 、 第 三 方 API 等 也 应
该 被 当 作 可 复 用 组 件 “ 。 甚 至 整 个 排
作 系 统 都 是 可 复 用 的 。
基 于 Web 应 用 的 后 端 服 务 是 一 个 超 级
复 杂 的 应 用 实 例 。 最 简 单 的 软 件 栈
(software stack) 通 常 由 几 层 组 成
( 从 最 底 层 开 始 ) :

  • 数 据 库 或 其 他 类 型 的 存 储 。
    97/ 1299
    1.9 系 统 级 环 境 隔 离
    Python 实 现 的 应 用 程 序 代 码 。
  • HTTP 服 务 器 , 例 如 Apache 或
    NGINX。
    当 然 , 这 些 软 件 可 以 进 一 步 简 化 , 但
    实 际 上 是 不 可 能 的 。 事 实 上 , 大 型 应
    用 往 往 复 杂 到 隼 以 区 分 每 一 层 。 大 型
    应 用 会 用 到 多 种 不 同 的 数 据 库 , 被 分
    为 多 个 独 立 进 程 , 还 会 用 到 许 多 其 他
    系 统 服 务 来 进 行 缓 存 、 队 列 、 记 录 日
    志 、 服 务 发 现 等 等 。 遗 憾 的 是 , 复 杂
    度 没 有 上 限 , 代 码 似 乎 只 是 遵 循 热 力
    学 第 二 定 律 而 巳 。
    真 正 重 要 的 是 , 并 非 所 有 的 软 件 栈 元
    素 都 可 以 在 Python 运 行 环 境 的 层 面 进
    行 隔 离 。 无 论 是 HTTP 服 务 器 ( 例 如
    NGINX) 还 是 关 系 型 数 据 库 管 理 系 统
    (RDBMS, 例 如 PostgreSQL) , 在
    98 / 1299
    1.9 系 统 级 环 境 隔 离
    不 同 的 系 统 上 通 常 都 有 不 同 的 版 本 。
    如 果 没 有 合 适 的 工 具 , 很 难 保 证 开 发
    团 队 中 每 个 人 使 用 的 每 个 组 件 的 版 本
    完 全 相 同 。 如 果 团 队 中 所 有 开 发 人 员
    都 在 开 发 同 一 个 项 目 的 话 , 那 么 所 有
    人 可 能 会 在 开 发 工 具 箱 上 获 得 相 同 版
    本 的 服 务 , 这 在 理 论 上 是 可 能 的 。 但
    如 果 他 们 使 用 的 操 作 系 统 与 生 产 环 境
    不 同 的 话 , 所 有 这 些 努 力 都 是 徒 劳
    的 。 当 然 也 不 可 能 强 迫 程 序 员 在 五 非
    本 人 最 喜 欢 的 系 统 上 工 作 。
    问 题 在 于 , 可 移 植 性 仍 然 是 一 项 巨 大
    的 挑 战 。 在 生 产 环 境 中 , 并 非 所 有 服
    务 的 运 行 方 式 都 和 在 开 发 人 员 电 脑 上
    完 全 相 同 , 而 且 这 一 点 不 可 能 改 变 。
    即 使 是 Python 在 跨 平 台 方 面 付 出 了 工
    大 的 努 力 , 但 在 不 同 系 统 上 的 行 为 也
    会 有 所 不 同 。 通 常 来 说 , 这 些 情 况 都
    99 1 1299
    1.9 系 统 级 环 境 隔 离
    有 详 细 的 文 档 , 只 有 直 接 进 行 系 统 调
    用 时 才 会 发 生 。 但 是 , 靠 程 序 员 的 记
    忆 力 来 记 住 一 长 串 兼 容 性 问 题 , 是 很
    容 易 出 错 的 。
    这 个 问 题 的 常 见 解 决 方 法 就 是 将 整 个
    系 统 隔 离 为 应 用 程 序 环 境 。 一 般 可 以
    利 用 各 种 类 型 的 系 统 虚 拟 化 工 具 来 实
    现 。 当 然 , 虚 拟 化 会 降 低 性 能 , 但 是
    现 代 计 算 机 的 硬 件 都 支 持 虚 拟 化 , 性
    能 损 失 通 常 可 以 忽 略 不 计 。 另 一 方
    面 , 可 能 的 好 处 却 有 很 多 , 如 下 所
    示 。
    。 开 发 环 境 可 以 完 全 匹 配 生 产 环
    境 中 使 用 的 系 统 版 本 和 服 务 , 这
    有 助 于 解 决 兼 容 性 问 题 。
    。 系 统 配 置 工 具 ( 如 Puppet、
    Chef 或 Ansible, 如 果 用 的 到 的
    100 11299
    1.9 系 统 级 环 境 隔 离
    话 ) 可 以 复 用 于 开 发 环 境 配 置 。
    。 如 果 可 以 自 动 创 建 这 样 的 环
    境 , 那 么 新 来 的 团 队 成 员 就 可 以
    轻 松 上 手 项 目 。
    。 开 发 人 员 可 以 直 接 调 用 系 统 底
    层 特 性 , 在 工 作 机 的 操 作 系 统 上
    可 能 没 有 这 些 特 性 , 举 个 例 子 ,
    在 Windows 中 不 可 用 的 用 户 空 间
    文 件 系 统 (File System in User
    Space, FSUS) 。
    1.9.1 使 用 Vagrant 的 虚 拟 开 发 环 境
    目 前 ,Vˇagrant 似 乎 是 最 流 行 的 工
    具 , 用 一 种 简 单 方 便 的 方 法 来 创 建 并
    管 理 开 发 环 境 。 它 可 用 于 Windows 、
    Mac OS 和 一 些 常 见 的 Linux 发 行 版 ,
    没 有 任 何 其 他 依 赖 。Vagrant 以 虚 拟
    1011 1299
    1.9 系 统 级 环 境 隔 离
    机 或 容 器 的 形 式 来 创 建 新 的 开 发 环
    境 。 具 体 实 现 取 决 于 虚 拟 化 供 应 商
    (provider) 。VirtualBox 是 与
    Vagrant 安 装 程 序 绑 定 的 默 认 供 应
    商 , 但 也 有 其 他 供 应 商 。 最 有 名 的 供
    应 商 是 VMware、Docker、LXC(Lin-
    ux Containers) 和 Hyper-V。
    vVagrant 最 重 要 的 配 置 是 一 个 名 为
    Vagrantfhle 的 文 件 。 每 个 项 目 的 这 个
    文 件 都 应 该 是 独 立 的 。 该 文 件 中 最 重
    要 的 内 容 如 下 所 示 。

。 选 择 虚 拟 化 供 应 商 。

  • 用 作 虚 拟 机 镜 像 的 box 文 件 。

。 选 择 环 境 搭 建 (provisioning)

方 法 。

。 虚 拟 机 (VM) 和 虚 拟 机 主 机 之

102 11299
1.9 系 统 级 环 境 隔 离

间 的 共 享 存 储 。

。 虚 拟 机 与 主 机 之 间 的 转 发 端

口 。
vVagranthle 的 语 法 语 言 是 Ruby。 示 例
配 置 文 件 提 供 了 用 于 吕 动 项 目 的 优 秀
模 板 , 并 且 还 有 详 细 的 文 档 , 因 此 无
需 掌 握 这 种 语 言 的 知 识 。 用 一 行 命 令
就 可 以 创 建 模 板 配 置 文 件 :
这 一 命 后 会 在 当 前 工 作 目 录 下 创 建 一
个 名 为 Vagranthle 的 新 文 件 。 通 常 最
好 将 这 个 文 件 保 存 在 相 关 项 目 的 根 目
录 下 。 这 个 文 件 已 经 是 一 个 有 效 配
置 , 可 以 利 用 默 认 供 应 商 和 基 础 镜 像
文 件 (base box) 来 创 建 新 的 虚 拟
机 。 默 认 不 启 用 环 境 搭 建 (provision

103 / 1299
1.9 系 统 级 环 境 隔 离
ing) 。 添 加 完 Vagranthfhle 后 , 利 用 下
面 这 个 命 令 可 以 启 动 新 的 虚 拟 机 :
初 始 启 动 可 能 需 要 几 分 钟 的 时 间 , 因
为 需 要 从 网 上 下 载 box 文 件 。 还 有 一
些 初 始 化 过 程 可 能 要 花 费 一 些 时 间 ,
这 取 决 于 使 用 的 供 应 商 、box 文 件 和
每 次 打 开 现 有 虚 拟 机 时 的 系 统 性 能 。
通 常 来 说 , 这 个 过 程 只 需 要 几 秒 。 一
旦 启 动 并 运 行 了 新 的 Vagrant 环 境 ,
开 发 者 可 以 利 用 下 面 这 个 简 短 的 命 令
连 接 SSH:
在 项 目 源 代 码 树 中 , 在 Vagrantfhle 之
下 的 任 何 位 置 都 可 以 运 行 这 一 命 令 。
104 1 1299
1.9 系 统 级 环 境 隔 离
为 了 方 便 开 发 人 员 , 我 们 会 在 上 层 目
录 中 查 找 配 置 文 件 , 些 与 相 应 的 虚 拟
机 实 例 进 行 匹 配 。 然 后 巳 会 建 立 安 全
的 shell 连 接 , 可 以 像 任 何 普 通 远 程 机
器 一 样 与 开 发 环 境 进 行 交 上 。 唯 一 的
区 别 在 于 , 整 个 项 目 的 源 代 码 树 ( 根
目 录 是 Vagrantfle 所 在 的 位 置 ) 是 在
虚 拟 机 文 件 系 统 的 /vagrant/ 目 录 下 。
1.9.2 容 器 化 与 虚 拟 化 的 对 比
容 器 是 全 机 器 虚 拟 化 的 替 代 方 法 。
是 轻 量 级 的 虚 拟 化 方 法 , 内 核 与 操 作
系 统 允 许 运 行 多 个 隔 离 的 用 户 空 间 实
例 。 容 器 和 主 机 之 间 共 享 操 作 系 统
(OS)〗 , 囚 此 从 理 论 上 来 说 , 这 种 方
法 的 开 销 比 完 全 虚 拟 化 要 少 。 这 样 的
容 器 只 包 含 应 用 程 序 代 码 和 系 统 级 的
依 赖 , 但 从 内 部 运 行 进 程 的 角 度 来
105 1 1299
1.9 系 统 级 环 境 隔 离
看 , 忆 看 起 来 像 一 个 完 全 隔 离 的 系 统
环 境 。
软 件 容 器 之 所 以 流 行 , 主 要 是 因 为
Docker, 这 是 容 器 的 可 用 实 现 志 一 。
Docker 可 以 用 名 为 Dockerfle 的 简 单
文 本 文 件 的 形 式 来 描 述 其 容 器 。 可 以
创 建 并 存 储 这 样 定 义 的 容 器 。 它 还 支
持 增 量 修 改 , 如 果 向 容 器 中 添 加 了 新
的 内 容 , 无 需 从 头 重 新 创 建 。
像 Docker 和 Vagrant 这 样 不 同 的 工 具
在 功 能 上 似 乎 有 所 交 叉 , 但 二 者 主 要
的 区 别 在 于 构 建 这 些 工 具 的 原 因 。 如
前 所 述 , 构 建 Vagrant 主 要 用 作 开 发
工 具 。 用 一 行 命 令 就 可 以 引 导 启 动 整
个 虚 拟 机 , 但 无 法 原 样 打 包 并 部 署 或
发 布 。 另 一 方 面 ,Docker 正 是 为 此 而
创 建 的 , 可 以 将 整 个 容 器 打 包 , 发 送
106 1 1299
1.9 系 统 级 环 境 隔 离
到 生 产 环 境 中 并 部 署 。 如 果 顺 利 实 现
的 话 , 这 可 以 大 大 改 进 产 品 部 署 的 过
程 。 因 此 , 只 有 Docker 和 类 似 的 解 决
方 案 ( 例 如 Rocket) 还 要 用 于 生 产 环
境 的 部 署 过 程 时 , 在 开 发 过 程 中 使 用
这 些 方 法 才 是 有 意 义 的 。 将 Docker 仅
用 于 开 发 过 程 的 隔 离 , 可 能 会 产 生 过
大 开 销 , 还 会 有 不 一 致 的 缺 点 。
107 1 1299
_1.1O 常 用 的 生 产 力 工 具
生 产 力 工 具 是 一 个 模 糊 的 术 语 。 一 方
面 , 几 乎 所 有 在 线 发 布 的 开 源 代 码 包
都 是 一 种 生 产 力 提 升 工 具 。 它 们 为 某
些 问 题 提 供 了 现 成 的 解 决 方 案 , 因 此
人 们 不 必 再 涂 费 时 间 ( 理 想 情 况
下 ) 。 另 一 方 面 , 可 以 说 整 个 Python
都 是 关 于 生 产 力 的 。 两 种 说 法 都 没 有
错 。Python 这 种 语 言 的 一 切 及 其 祀 区
几 乎 都 是 为 了 尽 可 能 高 效 地 开 发 软 件
而 设 计 的 。
这 就 建 立 了 一 个 正 反 馈 循 环 。 由 于 与
代 码 简 单 又 有 趣 , 所 以 很 多 程 序 员 用
空 闲 时 间 创 建 工 具 , 使 写 代 码 变 得 更
加 简 单 更 加 有 趣 。 基 于 这 一 事 实 , 这
里 为 生 产 力 工 具 给 出 一 个 非 常 主 观 而
且 不 科 学 的 定 义 : 使 开 发 过 程 更 加 简
108 / 1299
1.10 常 用 的 生 产 力 工 具
单 、 更 加 有 趣 的 一 款 软 件 。
从 定 义 来 看 , 生 产 力 工 具 主 要 关 注 开
发 过 程 中 的 某 些 特 定 环 节 , 例 如 测
试 、 调 试 和 包 管 理 , 并 不 是 所 构 建 产
品 的 核 心 部 分 。 在 标 些 情 况 下 , 里 然
每 天 都 会 用 到 这 些 工 具 , 但 它 们 甚 至
不 会 出 现 在 项 目 的 代 码 库 中 。
最 重 要 的 生 产 力 工 具 是 pip 和 venv, 本
章 前 面 已 经 讨 论 过 了 。 有 些 生 产 力 工
具 可 以 解 决 特 定 的 问 题 ( 如 分 析 和 测
试 ) , 本 书 有 专 门 的 章 节 来 介 绍 。 本
节 主 要 介 绍 一 些 其 他 章 节 没 有 提 到 而
又 十 分 值 得 推 荐 的 工 具 。
1.10.1 自 定 义 Python shell 一
IPython、bpython、ptpython 等
Python 程 序 员 在 交 互 式 解 释 器 会 话 上
109 1 1299
1.10 常 用 的 生 产 力 工 具
花 费 了 大 量 时 间 。 它 非 常 适 合 测 试 短
代 码 片 段 、 访 问 文 档 、 甚 至 在 运 行 时
调 试 代 码 。 默 认 的 Python 交 互 式 会 话
非 常 简 单 , 并 没 有 类 似 tab 补 全 或 代 码
内 省 助 手 (code introspection
helper) 的 许 多 功 能 。 幸 运 的 是 , 对
默 认 Python shell 的 扩 展 和 定 制 是 非
常 简 单 的 。
用 一 个 启 动 文 件 就 可 以 配 置 交 互 式 提
示 符 。Python 在 启 动 时 会 寻 找
PYTHONSTARTUP 环 境 变 量 , 并 执
行 这 一 变 量 指 向 的 文 件 中 的 代 码 。 有
些 Linux 发 行 版 提 供 了 默 认 的 启 动 脚
本 , 一 般 位 于 主 目 录 中 , 名 为 .
pythonstartup 。 通 常 会 提 供 tab 补 全
功 能 和 命 令 历 史 记 录 来 加 强 提 示 行 ,
这 些 功 能 是 基 于 readline 模 块 。 ( 你
需 要 安 装 readline 库 。

110 1 1299
1.10 常 用 的 生 产 力 工 具
如 果 你 没 有 这 样 的 文 件 , 创 建 一 个 也
很 容 易 。 下 面 是 最 简 单 的 启 动 文 件 示
例 , 添 加 了 键 补 全 功 能 和 显 示 历 史 记
录 ;
江 python 启 动 文 件
import read1Line
import rLcomptleter
import atexit
import 0S
江 七 ab 补 全
readLine.parse_and_bind ( 「tab :
complete 「 )
江 历 史 记 录
histfiLe =
0s,path.join(os.environ [「“HOME 「] ,
ˇ pythonhistory )
七 ry:
readlLine. read_history__fiLe(histfiLe)
eXcept I0Error 「
pass
1111 1299
1.10 常 用 的 生 产 力 工 具

ry_file,histfilLe)

del os,histfiLle,readtLine,

rLcomptleter

在 主 目 录 中 创 建 这 个 文 件 并 命 名 为 .

pythonstartup 。 然 后 在 环 境 中 添 加

PYTHONSTARTUP 变 量 , 其 值 为 该

文 件 的 路 径 。

  1. 设 置 PYTHONSTARTUP 环 境

变 量

如 果 你 用 的 是 Linux 或 MAC _OS X 系

统 , 最 简 单 的 方 法 就 是 在 主 文 件 夹 中

创 建 启 动 脚 本 。 然 后 将 它 与 系 统 shell

启 动 脚 本 中 的 PXYTHONSTARTUP 环

境 变 量 链 接 在 一 起 。 举 个 例 子 ,Bash

和 Korn shell 用 的 都 是 . profnle 女

件 , 你 可 以 在 里 面 插 入 这 样 一 行 :
112 / 1299
1.10 常 用 的 生 产 力 工 具
export PYTHONSTARTUP=
一 / .pythonstartup
如 果 你 用 的 是 Windows, 做 法 也 很 简
单 : 以 管 理 员 身 份 在 系 统 首 选 项 中 设
置 新 的 环 境 变 量 , 然 后 将 脚 本 保 存 在
常 用 文 件 夹 , 不 要 使 用 特 定 的 用 户 文
件 夹 。
编 与 PYTHONSTARTUP 脚 本 可 能 是
一 项 很 好 的 练 习 , 但 独 自 创 建 优 秀 的
自 定 义 shell 却 是 一 项 很 少 人 有 时 间 完
成 的 挑 战 。 幸 运 的 是 , 已 经 有 一 些 自
定义PYt『1Or〕 酗e‖的实现, 可 以 极 大
地 提 高 Python 交 互 式 会 话 的 体 验 。

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

113 / 1299
1.10 常 用 的 生 产 力 工 具
趣 的 功 能 如 下 所 示 。

动 态 对 象 自 省 。

在 提 示 符 中 访 问 系 统 shell。

支 持 直 接 分 析 。

。 方 便 调 试 。
现 在 ,IPython 已 经 成 为 大 型 项 目
Jupyter 的 一 部 分 , 该 项 目 提 供 了 实 时
代 码 的 交 互 式 notebook, 支 持 多 种 不
同 的 语 言 。

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

内 联 语 法 高 亮 。

114 1 1299
1.10 常 用 的 生 产 力 工 具

。 类 似 Readline 的 自 动 补 全 , 在

你 输 入 时 会 显 示 建 议 。

。 对 任 何 Python 园 数 都 有 预 期 参

数 列 表 。

。 自 动 缩 进 。

支 持 Python 3。

4.、ptpython
ptpython 是 另 一 款 高 级 的 Python
shell。 在 这 个 项 目 中 , 核 心 提 示 符 应
用 的 实 现 是 一 个 叫 作 prompt_toolkit
的 独 立 包 ( 来 自 同 一 作 者 ) 。 这 样 你
可 以 轻 松 创 建 各 种 美 观 的 交 互 式 命 令
行 界 面 。
通 常 会 将 ptpython 与 bpython 在 功 能
上 进 行 比 较 , 但 主 要 区 别 在 于 ,

115 / 1299
1.10 常 用 的 生 产 力 工 具
ptpython 能 够 与 IPython 及 其 某 些 语 法
兼 容 , 利 用 这 些 语 法 可 以 实 现 一 些 附
加 功 能 , 例 如 % pdb 、%cpaste
或 %profle。
1.10.2 节 上 式 调 试 器
代 码 调 试 是 软 件 开 发 过 程 中 的 重 要 环
节 。 许 多 程 序 员 浪 费 大 量 时 间 , 仅 使
用 大 量 的 日 志 记 录 和 print 语 句 作 为 主
力 调 试 工 具 , 但 大 多 数 专 业 开 发 人 员
更 喜 欢 使 用 某 种 调 试 器 。
Python 已 经 内 置 了 一 款 交 互 式 调 试
器 , 名 为 pdb。 它 可 以 在 命 令 行 中 调
用 并 作 用 在 现 有 脚 本 上 , 如 果 程 序 异
常 退 出 ,Python 将 会 进 入 事 后 调 试 状
态 (post-mortem debugging) :
116 / 1299
1.10 常 用 的 生 产 力 工 具
事 后 调 试 虹 然 很 有 用 , 但 并 不 会 涵 盖
所 有 场 景 。 只 有 在 bug 出 现 的 同 时 应
用 程 序 抛 出 异 常 并 退 出 , 事 后 调 试 才
有 用 。 大 多 数 情 况 下 , 错 误 代 码 只 是
行 为 异 常 , 但 并 不 会 意 外 退 出 。 这 时
可 以 在 某 行 代 码 上 设 置 自 定 义 断 点 ,
只 需 添 加 下 面 这 行 代 码 :
在 运 行 代 码 时 ,Python 解 释 器 会 在 该
行 代 码 处 启 动 调 试 会 话 。
pdb 用 于 跟 踪 问 题 非 常 好 用 , 第 一 眼
看 去 , 它 和 著 名 的 GDB (GNU 调 试
器 ) 非 常 类 似 。 由 于 Python 是 一 门 动
态 语 言 ,pdb 会 话 与 普 通 解 释 器 会 话
非 常 类 似 。 开 发 人 员 不 仅 可 以 跟 踪 代
码 运 行 , 而 且 还 可 以 任 意 调 用 代 码 ,
117/11299
1.10 常 用 的 生 产 力 工 具
甚 全 执 行 模 块 导 入 。
遗 憾 的 是 ,pdb 来 源 于 bdb, 所 以 第 一
次 使 用 pdb 可 能 会 有 点 难 以 适 应 , 因
为 诸 如 h、b、s、n、 j 和 r 这 样 的 单 字
母 调 试 命 令 会 让 人 不 知 所 云 。 每 当 有
疑 问 时 , 在 调 试 会 话 期 间 输 入 help
pdb 命 令 , 会 给 出 大 量 的 用 法 和 附 加
信 息 。
pdb 中 的 调 试 会 话 也 非 常 简 单 , 并 没
有 提 供 类 似 tab 补 全 或 代 码 高 亮 之 类 的
附 加 功 能 。 幸 运 的 是 ,PyPI 上 有 几 个
包 可 以 在 上 节 提 到 的 Python shell 中
实 现 这 些 功 能 。 最 有 名 的 例 子 是 。
ipdb: 基 于 ipython 的 独 立 包 。
s ptpdb: 基 于 ptpython 的 独 立
包 。
118 / 1299
1.10 常 用 的 生 产 力 工 具

  • basb: 引 uoyiranyil 宇 .
    119 / 1299
    _1.11 有 用 的 资 源
    互 联 网 为 Python 开 发 者 提 供 了 丰 富 的
    有 用 资 源 。 前 面 已 经 提 到 过 , 但 这 里
    我 们 再 重 复 一 遍 , 最 重 要 的 也 是 最 显
    而 易 见 的 资 源 如 下 所 示 。
    *Python 文 档 。
    。PyPI 一 Python 包 索 引 。
    PEP 0 一 一 Python 改 进 提 案 的
    索 引 。
    类 似 书 籍 和 教 程 之 类 的 其 他 资 源 也 很
    有 用 , 但 往 往 很 快 就 会 过 时 。 社 区 积
    极 维 护 的 资 源 或 者 定 期 发 布 的 资 源 ,
    都 是 不 会 过 时 的 。 最 值 得 推 荐 的 是 下
    面 两 个 :
    120 1 1299
    1.11 有 用 的 资 源
    。 Awesome-Python 里 面 包 括 流
    行 包 和 框 架 的 列 表 。
    。 Python Weekly 是 一 个 著 名 的
    业 务 通 讯 (newletter) , 每 周 向
    订 阅 者 发 送 许 多 新 鲜 有 趣 的
    Python 包 和 资 源 。
    这 两 个 资 源 包 含 大 量 阅 读 资 料 , 可 供
    读 者 阅 读 数 月 。
    12111299
    1.1 Pandas 是 什 么
    1.1.1 “_Python 简 介
    Python 是 一 门 强 大 的 编 程 语 言 , 它 简
    单 易 学 , 提 供 众 多 高 级 数 据 结 构 , 让
    我 们 可 以 面 向 对 象 编 程 。Python 是 一
    门 解 释 型 语 言 , 语 法 优 雅 贴 近 人 类 自
    然 语 言 , 符 合 人 类 的 认 知 习 惯 。
    Python 支 持 跨 平 台 , 能 够 运 行 在 所 有
    的 常 见 操 作 系 统 上 。Python 在 近 期 热
    门 的 大 数 据 、 科 学 研 究 、 机 器 学 习 、
    人 工 智 能 等 领 域 大 显 身 手 , 并 且 几 乎
    在 所 有 领 域 都 有 应 用 , 因 此 学 习 亡 十
    分 划 算 。
    Python 由 茨 兰 人 吉 多 . 范 罗 苏 姆
    (Guido van Rossum) 创 造 , 第 一
    版 发 布 于 1991 年 。 关 于 为 何 有 Python
    这 个 项 目 , 吉 多 . 范 罗 苏 姆 在 1996 年
    20 1 1350
    1.1 Pandas 是 什 么
    曾 写 道
    6 年 前 , 也 就 是 1989 年 12 月 , 我 在 寻
    找 一 门 课 余 编 程 项 目 来 打 发 圣 诞 节
    前 后 的 时 间 。 到 时 我 的 办 公 室 会 关
    门 , 而 我 只 有 一 台 家 用 电 脑 , 没 有 什
    么 其 他 东 西 。 我 决 定 为 我 当 时 正 在 构
    思 的 新 的 脚 本 语 言 写 一 个 解 释 器 , 它
    是 ABC 语 言 的 后 代 , 对 UNIX/C 程 序
    员 会 有 吸 引 力 。 当 时 我 对 项 目 叫 什 么
    名 字 并 不 太 在 乎 , 由 于 我 是 《 蒙 提 . 泳
    森 的 飞 行 马 戏 团 》 的 狂 热 爱 好 者 , 我
    就 选 择 了 用 Python 作 为 项 目 的 名 字 。
    《 蒙 提 . 派 森 的 飞 行 马 戏 团 》 (Monty
    Pythop「s Fyipng Ccus) 是 BBC 播 出
    的 英 国 电 视 喜 剧 剧 集 , 蒙 提 . 派 森
    (Monty Python) 是 创 作 该 剧 的 六 人
    喜 剧 团 队 , 由 此 可 见 ,Python 虹 原 意
    2111350
    1.1 Pandas 是 什 么
    都 在 内 部 大 量 使 用 Python。
  1. Web 开 发
    简 单 来 说 ,Web 开 发 就 是 开 发 网 络 站
    点 , 包 括 PC 站 点 、 移 动 站 点 (m
    站 ) 、App、 小 程 序 的 数 据 接 口 。 一
    些 流 行 的 Python 框 架 , 如 Django 、
    Flask、Tornado 等 , 可 以 让 我 们 在 做
    Web 开 发 时 省 时 又 省 力 。 知 乎 、 豆 瓣
    等 就 是 使 用 Python 开 发 的 知 名 网 站 。
  2. 网 络 爬 虫
    爬 虫 模 拟 用 户 登 录 网 站 , 爬 取 我 们 需
    要 的 数 据 , 只 要 你 能 看 到 的 信 息 它 都
    可 以 批 量 、 定 时 、 快 速 地 爬 取 下 来 并
    整 理 好 。 爬 虫 还 可 以 帮 你 注 册 、 登
    录 、 提 交 数 据 。Python 自 带 的 urllib 库
    以 及 第 三 方 的 requests、Scrappy 都
    23 / 1350
    1.1 Pandas 是 什 么
    是 做 这 件 事 的 高 手 。
  3. 计 算 与 数 据 分 析
    研 究 人 员 需 要 对 数 据 进 行 分 析 处 理 ,
    NumPy、SciPy、Matplotlib 等 第 三 方
    库 可 以 进 行 科 学 计 算 。 数 据 处 理 是 我
    们 工 作 学 习 中 的 日 常 , 各 种 Excel 表 格
    都 可 以 用 Python 方 便 地 进 行 处 理 , 而
    且 既 高 效 又 能 实 现 批 量 和 自 动 化 , 我
    们 不 用 再 每 天 做 重 复 的 工 作 。 提 供 包
    括 可 视 化 在 内 的 一 搅 子 解 决 方 案 的
    Pandas 越 来 越 受 欢 迎 , 成 为 Python
    培 训 公 司 的 吸 金 课 程 。 常 见 的 数 据 可
    视 化 库 有 Matplotlib 、Ploty 、
    Seaborn 等 , 此 外 , 基 于 数 据 可 视 化
    前 端 项 目 Echarts 的 pyecharts 也 越 来
    越 受 欢 迎 。
  4. 界 面 (GUI) 开 发

24 1 1350
1.1 Pandas 是 什 么
Python 目 带 的 TKkinter 库 支 持 GUI 开
发 , 让 用 户 通 过 图 形 界 面 进 行 交 互 。
还 可 以 选 择 wxPython 或 PyQt 等 三 方
GUI 库 开 发 跨 平 台 的 桌 面 软 件 。 通 过
PyInstaller 将 程 序 发 布 为 独 立 的 安 装
程 序 包 , 即 可 在 Windows、masOS 等
平 台 上 安 装 和 运 行 。
5. 人 工 智 能
近 年 来 , 机 器 学 习 、 神 经 网 络 、 深 度
学 习 等 人 工 智 能 领 域 越 来 越 离 不 开
Python,Python 已 经 成 为 这 些 领 域 的
主 流 编 程 语 言 。Facebook 的 神 经 网 络
框 架 PyTorch 和 Google 的 TensorFlow
都 有 Python 语 言 版 本 。scikit-learn 是
机 器 学 习 领 域 最 知 名 的 Python 库 之
6. 游 戏 开 发

25 1 1350
1.1 Pandas 是 什 么
Python 可 以 编 写 一 些 小 游 戏 , 当 然 在
大 型 游 戏 中 也 扮 演 着 重 要 的 角 色 , 如
很 多 大 型 游 戏 用 C++ 编 写 图 形 显 示 等
高 性 能 模 块 , 用 Python 编 写 一 些 逻 辑
模 块 。PyGame 库 可 用 于 直 接 开 发 一
些 简 单 游 戏 , 其 他 的 Python 游 戏 库 还
有 Turtle、Pymunk、Arcade、Pyglet
反 Cocos2d 等 。 知 名 游 戏 Sid Meier s
Civilization (《 文 明 》 就 是 使 用
Python 实 现 的 。
7. 图 形 图 像
Python 可 以 处 理 图 像 , 做 视 频 温 染 。
众 多 工 业 级 大 型 软 件 开 放 了 Python 接
口 , 供 使 用 者 自 己 编 辑 处 理 程 序 。 图
形 图 像 可 以 应 用 在 医 学 影 像 分 析 、 影
视 制 作 、 人 脸 识 别 、 无 人 驾 驶 等 领
域 。 相 关 的 库 包 有 PIL、OpenCV 、
26 1 1350
1.1 Pandas 是 什 么

SimplelITK、Pydicom 等 。

  1. 其 他

Python 是 IT 行 业 运 维 人 员 、 黑 客 的 主

要 工 作 语 言 , 云 计 算 搭 建 、 用 PyRo 工

具 包 进 行 机 器 人 控 制 编 程 已 经 有 众 多

的 业 务 实 践 。

1.1.3 “ 为 什 么 不 选 择 R

众 所 周 知 ,R 语 言 是 专 门 针 对 数 据 领

域 的 开 发 语 言 , 同 样 也 是 开 源 、 免

费 、 跨 平 台 的 , 虽 然 各 大 公 司 招 聘 岗

位 描 述 上 要 求 掌 握 Python 或 者 R 语

言 , 但 笔 者 还 是 不 推 荐 学 习 R。

首 先 ,Python 更 加 简 单 。Python 语 法

更 加 接 近 英 文 自 然 语 言 , 学 习 路 径

短 , 有 大 量 的 图 书 和 网 络 资 料 。 其
2711350
1.1 Pandas 是 什 么
次 ,Python 生 态 更 加 完 善 。 在 数 据 科
学 领 域 有 许 多 强 大 的 库 来 满 足 我 们 不
同 的 需 求 , 如 数 据 获 取 (Scrapy 、
BeautifulSoup) 、 科 学 计 算 (NumP
y、SciPy 、PyTorch) 、 可 视 化
(Matplotlib、Seaborn) 、 机 器 学 习
(scikit-learn、TensorFlow) 等 。
最 后 ,Python 更 加 通 用 ,Python 几 乎
可 以 应 用 在 所 有 领 域 。
1.1.4 “_Pandas 简 介
Pandas 是 使 用 Python 语 言 开 发 的 用
于 数 据 处 理 和 数 据 分 析 的 第 三 方 库 。
已 擅 长 处 理 数 字 型 数 据 和 时 间 序 列 数
据 , 当 然 文 本 型 的 数 据 也 能 轻 松 处
理 。
作 为 Python 的 三 方 库 ,Pandas 是 建
28 1 1350
1.1 Pandas 是 什 么

构 在 Python 的 基 础 上 的 , 它 封 装 了 一

些 复 杂 的 代 码 实 现 过 程 , 我 们 只 要 调

用 宁 的 方 法 就 能 轻 松 实 现 我 们 的 需

求 。

说 明

Python 中 的 库 、 框 架 、 包 意 义 基 本

相 同 , 都 是 别 人 造 好 的 轮 子 , 我 们

可 以 直 接 使 用 , 以 减 少 重 复 的 逻 辑

代 码 。 正 是 由 于 有 众 多 覆 盖 各 个 领

域 的 框 架 , 我 们 使 用 起 Python 来 才

能 简 单 高 效 , 而 不 用 关 注 技 术 实 现

细 节 。

Pandas 由 Wes “MckKinney 于 2008 年

开 发 。McKinney 当 时 在 纽 约 的 一 家
29 1 1350
1.1 Pandas 是 什 么
金 融 服 务 机 构 工 作 , 金 融 数 据 分 析 需
要 一 个 健 壮 和 超 快 速 的 数 据 分 析 工
具 , 于 是 他 就 开 发 出 了 Pandas。
Pandas 的 命 名 跟 熊 猫 无 关 , 而 是 来 自
计 量 经 济 学 中 的 术 语 “ 面 板 数 据 “
(Panel data) 。 面 板 数 据 是 一 种 数
据 集 的 结 构 类 型 , 具 有 横 截 面 和 时 间
序 列 两 个 维 度 。 不 过 , 我 们 不 必 了 解
它 , 它 只 是 一 种 灵 感 、 思 想 来 源 。
Pandas 目 前 已 经 更 新 到 1.2.1 版 本 , 本
书 就 是 基 于 这 个 版 本 编 写 的 。
1.1.5 ˇPandas 的 使 用 人 群
Pandas 对 数 据 的 处 理 是 为 数 据 分 析 服
务 的 , 它 所 提 供 的 各 种 数 据 处 理 方
法 、 工 具 是 基 于 数 理 统 计 学 的 , 包 吾
了 日 常 应 用 中 的 众 多 数 据 分 析 方 法 。
30 11350
1.1 Pandas 是 什 么
我 们 学 习 它 不 仅 要 掌 控 它 的 相 应 技
术 , 还 要 从 它 的 数 据 处 理 思 路 中 学 习
数 据 分 析 的 理 论 和 方 法 。
特 别 地 , 如 果 你 想 要 成 为 数 据 分 析
师 、 数 据 产 品 经 理 、 数 据 开 发 工 程 师
等 与 数 据 相 关 的 工 作 者 , 学 习 Pandas
能 让 你 深 入 数 据 理 论 和 实 践 , 更 好 地
理 解 和 应 用 数 据 。
Pandas 可 以 轻 松 应 对 白 领 们 日 常 工 作
中 的 各 种 表 格 数 据 处 理 需 求 , 还 应 用
在 金 融 、 统 计 、 数 理 研 究 、 物 理 计
算 、 社 会 科 学 、 工 程 等 领 域 。
Pandas 可 以 实 现 复 杂 的 处 理 逻 辑 , 这
些 往 往 是 Excel 等 工 具 无 法 完 成 的 , 还
可 以 自 动 化 、 批 量 化 , 免 去 我 们 在 处
理 相 同 的 大 量 数 据 时 的 重 复 工 作 。
3111350
1.1 Pandas 是 什 么
Pandas 可 以 实 现 非 常 震 撼 的 可 视 化 效
果 , 它 对 接 众 多 令 人 赏 心 悦 目 的 可 视
化 库 , 可 以 实 现 动 态 数 据 交 互 效 果 。
以 上 这 些 强 大 的 功 能 , 在 本 书 后 面 的
学 习 中 你 会 有 所 体 会 。
1.1.6 “ˇPandas 的 基 本 功 能
Pandas 常 用 的 基 本 功 能 如 下 :
o“_ 从 Excel、CSV、 网 页 、
SQL、 剪 贴 板 等 文 件 或 工 具 中 读 取
数 据 ;
o _ 合 并 多 个 文 件 或 者 电 子 表 格 中
的 数 据 , 将 数 据 拆 分 为 独 立 文 件 ;
0 “ 数 据 清 洗 , 如 去 重 、 处 理 缺 失
值 、 填 充 默 认 值 、 补 全 格 式 、 处 理
32 11350
1.1 Pandas 是 什 么

极 端 值 等 ;

0 建 立 高 效 的 索 引 | ;

0 支 持 大 体 量 数 据 ;

2 按 一 定 业 务 逻 辑 插 入 计 算 后 的

列 、 删 除 列 ;

2 灵 活 方 便 的 数 据 查 询 、 筛 选 ;

2 分 组 聚 合 数 据 , 可 独 立 指 定 分

组 后 的 各 字 段 计 算 方 式 ;

0 数 据 的 转 置 , 如 行 转 列 、 列 转

行 变 更 处 理 ;

2 连 接 数 据 库 , 直 接 用 SQL 查 询

数 据 并 进 行 处 理 ;

0 对 时 序 数 据 进 行 分 组 采 样 , 如

按 季 、 按 月 、 按 工 作 小 时 , 也 可 以
33 11350
1.1 Pandas 是 什 么

自 定 义 周 期 , 如 工 作 日 ;

o “ 窗 口 计 算 , 移 动 窗 口 统 计 、 日

期 移 动 等 ;

0 “ 灵 活 的 可 视 化 图 表 输 出 , 支 持

所 有 的 统 计 图 形 ;

o “ 为 数 据 表 格 增 加 展 示 样 式 , 提

高 数 据 识 别 效 率 。
1.1.7 “_Pandas 的 学 习 方 法
对 于 一 个 新 工 具 , 我 们 的 目 标 就 是 能
够 使 用 乙 , 让 宁 发 挥 价 值 。 因 此 , 学
习 Pandas 最 好 的 方 法 就 是 用 它 处 理 自
己 熟 悉 的 数 据 , 并 把 日 常 工 作 中 需 要
手 动 处 理 的 表 格 用 Pandas 来 处 理 。 刚
开 始 可 能 不 能 完 全 替 代 , 但 慢 慢 积
累 , 就 会 得 心 应 手 。

34 11350
1.1 Pandas 是 什 么
在 学 习 初 期 , 只 需 要 对 着 教 程 去 模
仿 , 总 结 和 归 纳 涉 及 的 常 用 操 作 , 同
时 养 成 遇 到 不 懂 的 地 方 查 看 团 数 说 明
和 官 方 文 档 (httbs://
pandas.pydata.org/docs/y)〗 的 习
惯 。
本 书 侧 重 于 Pandas 的 使 用 , 故 不 过 多
地 讲 解 数 据 分 析 方 法 , 不 过 Pandas 提
供 的 数 据 分 析 方 法 给 我 们 提 供 了 厂 阔
的 数 据 分 析 思 路 , 可 以 帮 助 我 们 建 立
完 善 的 数 据 分 析 理 论 体 系 。
另 外 , 本 书 不 会 把 所 有 的 执 行 结 果 一
一 展 示 出 来 , 而 是 讲 清 楚 代 码 的 作 用
是 什 么 , 由 读 者 举 一 反 三 , 自 己 写 代
码 并 运 行 。
1.1.8 “ 小 结

3511350

Backlinks