前言
先说一个必须摆在最前面的事实:Python 2.7 已于 2020 年 1 月 1 日停止维护(依据是官方的 PEP 373 生命周期文档,其中明确写着「Support officially stopped January 1 2020」)。也就是说,Python 2.7 系列不再收到任何安全补丁或缺陷修复,包括 2.7.14 在内的所有 2.7 版本都已经过期。
所以这个标题的写法在今天是有问题的。如果这是一篇 2017 年前后的教程,装 2.7.14 还算合理;放到现在,正确的做法是装 Python 3,而不是装一个已经停止维护的解释器。本文因此不会教你怎么装 2.7.14,而是会说明:为什么今天不该装它、2.7 的旧语法错在哪里、以及现在应该怎么装 Python 3。
需要声明的是,本机没有任何 Python 解释器,本文的代码和命令均无法实际运行验证,都是按官方文档整理的写法,请以 Python 官方文档为准。文中也不会把任何命令描述成已经执行完成。
一、为什么今天的答案是「不要装 2.7.14」
判断一个软件能不能用,不能只看「它当年好不好用」,要看它现在还有没有维护。
| 维度 | Python 2.7 | Python 3(当前主线) |
|---|
| 维护状态 | 2020-01-01 起停止维护 | 持续维护,有活跃的版本更新 |
| 安全补丁 | 不再提供 | 持续提供 |
| 新库支持 | 大量新库早已只支持 3 | 主流选择 |
| 语法 | 与 3 有大量不兼容 | 现行标准 |
| 教学资料 | 大量过时教程 | 官方文档持续更新 |
一个不再发安全补丁的解释器,用在任何联网环境里都是隐患。所以「安装 2.7.14 图文教程」这一类需求,正确响应方式是引导到 Python 3。
二、Python 2 的旧写法为什么不能用了
即使你手上有一段 Python 2 的老代码,也应当把它迁移到 Python 3。下面逐条列出最典型的断裂点:
断点一:print是语句,不是函数。
print "hello" # Python 2:合法在 Python 3 里必须写成函数调用:
# 适用于 Python 3 全版本
print("hello")断点二:字典的iteritems/iterkeys/itervalues已移除。
Python 2 里d.iteritems()返回迭代器,在 Python 3 里这个方法已经不存在,直接调用会报 AttributeError。Python 3 的写法是:
# 适用于 Python 3 全版本
d = {"a": 1, "b": 2}
for k, v in d.items(): # 返回视图对象,可迭代
print(k, v)要的是.items()/.keys()/.values(),而且在 Python 3 里它们返回的是视图(view),不是列表。
断点三:unicode/basestring/long类型不存在了。
Python 3 把文本统一成str,字节序列用bytes,「长整数」long也并入了int。老代码里isinstance(x, basestring)这类判断需要改写。
断点四:xrange已移除。
Python 3 里range本身就是惰性(lazy)的,直接用它即可,不需要xrange。
断点五:整数除法行为不同。
# 适用于 Python 3 全版本
print(3 / 2) # 1.5
print(3 // 2) # 1,整除要显式写 //Python 2 里3 / 2是1(整数除法),Python 3 里是1.5。这是迁移时最容易改变程序逻辑的一处。
断点六:字符串默认是 Unicode 语义。
Python 3 的str是 Unicode 文本,bytes是字节序列,两者不能随意拼接。Python 2 的str是字节语义,u"..."前缀用来构造 Unicode 字符串。在 Python 3 里u"..."前缀虽仍可写,但已不再是必需项。
三、现在应该怎么装 Python 3
正确的安装流程并不复杂:
- 到 Python 官方站点的下载页,选择当前稳定版本(3.x 主线)的安装包。
- Windows 上运行安装程序,注意勾选项的含义;不想污染系统就选自定义安装。
- 安装后新开一个终端,验证:
# 适用于任意已安装的 Python 3
python --version
python3 --version不同系统上命令名可能是python或python3。如果不确定哪个命令可用,两个都试一下。
- 用「某个已知能跑的老版本 Python 2 脚本」做一次迁移验证,而不是把 2.7 装回来。
如果你是在为一段老项目维持 Python 2 环境(例如某些陈旧的构建流水线),那属于特殊的历史包袱场景,需要独立评估,且必须把它隔离在不联网或受限网络中运行。但新写的代码一律用 Python 3。
# 适用于 Python 3.8+,一个可直接运行的小程序
def main():
names = ["Ada", "Linus", "Guido"]
for i, name in enumerate(names, start=1):
print(i, name)
if __name__ == "__main__":
main()四、把老代码迁到 Python 3 的检查清单
面对一段 Python 2 的老代码,可以按下面的对照表逐项过一遍:
| 检查项 | 旧写法 | 现行写法 |
|---|
| 输出 | print x | print(x) |
| 字典遍历 | d.iteritems() | d.items() |
| 区间 | xrange(n) | range(n) |
| 整除 | 用/当整除 | 显式写// |
| 类型判断 | basestring | str |
| 文本前缀 | u"..."当必需 | 不再必需 |
迁移时不要一次改完就上生产。稳妥的做法是:先把代码放进目标 Python 3 版本,遇到报错逐个改;再用小规模真实数据做一次对照,确认结果与旧版本一致。输出一致,才说明迁移没有引入逻辑变化。
# 适用于 Python 3 全版本:迁移后的写法
def average(items):
total = 0
for item in items:
total += item
return total / len(items)
print(average([1, 2, 3, 4])) # 2.5在 Python 2 里,上面那句/ len(items)走的是整数除法,结果会被截断;迁到 Python 3 后它变成真除法,结果带上小数部分。这正是迁移最容易改变程序行为的地方,所以每一处除法都要人工确认:到底想要整除,还是想要真除法。
常见坑点
1. 看到老教程就去装 2.7.14。
- ❌ 照抄一篇几年前的图文教程,装了一个已停止维护的解释器。
- ✅ 先认清 2.7 已于 2020-01-01 停止维护,改用 Python 3。
2. 把print "x"当成能跑的写法。
- ❌ 从老代码里复制
print "hello"到 Python 3 里,直接 SyntaxError。 - ✅ 改成
print("hello")。
3. 继续调用d.iteritems()。
- ❌ 以为
iteritems还在,运行报 AttributeError。 - ✅ 改用
d.items()。
4. 用xrange写循环。
- ❌ 老代码里的
xrange(10)在 Python 3 里 NameError。 - ✅ 直接用
range(10),它本身就是惰性的。
5. 没意识到/的语义变了。
- ❌ 迁移后脚本结果对不上,查半天发现是
3 / 2从 1 变成了 1.5。 - ✅ 想整除就显式写
//,想真除就用/。
6. 把u"..."当成 Python 3 的必需前缀。
- ❌ 到处加
u前缀,以为不加就不是 Unicode。 - ✅ 在 Python 3 里
str本身就是 Unicode,前缀不必需。
7. 想在一个系统里同时留 2.7 和 3.x 却不做隔离。
- ❌ 两个版本命令互相顶替,
python指向谁全看 PATH。 - ✅ 用虚拟环境或版本管理工具隔离,绝不让两套解释器混在同一个环境。
8. 在联网机器上跑无安全补丁的解释器。
- ❌ 为了跑一段老脚本,在联网环境里长期使用已停止维护的版本。
- ✅ 要么迁移到 Python 3,要么把老环境隔离在受限网络中。
总结
| 问题 | 结论 |
|---|
| Python 2.7 还在维护吗 | 不在,2020-01-01 停止维护 |
| 2.7.14 能装吗 | 能装,但不该用在今天的项目中 |
| 正确做法 | 安装并使用 Python 3 |
| 迁移重点 | print函数化、.items()、//整除、Unicode 语义 |
这个标题本身反映的是一种已经过时的需求。今天再写这类教程,负责任的写法不是教人怎么装 2.7.14,而是说清楚它为什么已经不该用了,并把读者引到 Python 3 的安装与迁移路径上。