Python 解释器选择实战指南:Python 3 与 Python 2 的取舍及五大主流实现深度解析(The Hitchhiker's Guide to Python)
【免费下载链接】python-guidePython best practices guidebook, written for humans.项目地址: https://gitcode.com/gh_mirrors/py/python-guide
本文以《The Hitchhiker's Guide to Python》开源文档仓库(gh_mirrors/py/python-guide)中 docs/starting/which-python.rst 为骨架,结合仓库内安装与开发环境配套文档,系统讲解「选哪个解释器」这一每个 Python 开发者都要面对的首要决策:Python 3 还是 Python 2?CPython、PyPy、Jython、IronPython、PythonNet 各自的定位、原理与适用场景是什么?读完本文,你将掌握一套可落地的解释器选型依据,并能在对应操作系统上完成从解释器安装、pip/setuptools 配齐到虚拟环境隔离的完整初始化流程。
一、Python 的现状:Python 3 与 Python 2 的格局
在挑选 Python 解释器时,一个挥之不去的问题始终存在:"我该选 Python 2 还是 Python 3?"这个问题的答案比想象的更微妙。本仓库文档给出的基本判断如下:
- 如今绝大多数生产环境应用都在使用 Python 3;
- Python 3 已具备在生产环境部署应用的条件;
- Python 2 于 2020 年 1 月 1 日终止官方生命周期(EOL),此后不再获得官方安全修复(依据 PEP 373,原文档脚注 [#pep373_eol]);
- "Python" 这个品牌名称同时涵盖 Python 3 与 Python 2 两个系列。
关键点在于最后一条:"Python" 既指 3 也指 2。因此当别人说"我用 Python"时,你仍需要追问一句"哪个系列的哪个版本"——这正是本文要帮你建立的判断力。
值得一提的是,本仓库自身的构建环境也在践行这一判断:仓库根目录的 runtime.txt 中仅有一个版本号3.8,即文档站点构建固定使用 Python 3.8;而 requirements.txt 中锁定的 Sphinx、docutils、Jinja2 等依赖同样面向 Python 3 环境。也就是说,连这份"教你选解释器"的文档本身,就是跑在 Python 3 上的。
二、官方建议:新项目一律用 Python 3
仓库原文收录了作者 Kenneth Reitz 的明确态度,这是《Hitchhiker's Guide》一贯的"观点鲜明"风格:
强烈建议使用Python 3而非 Python 2。如果你今天仍在生产环境中使用 Python 2,请考虑升级你的应用与基础设施。如果你正在使用 Python 3,恭喜——你确实品味不凡。 ——Kenneth Reitz
把这句话翻译成可执行的决策规则,就是:
- 新写的 Python 应用,一律使用 Python 3;
- 如果你是 Python 初学者,熟悉 Python 2.7 会有帮助,但学习 Python 3 的价值更大;
- 两个都学——它们都是"Python",很多旧代码、旧系统仍是 Python 2,具备阅读 Python 2 的能力是现实需求。
三、So…… 到底选 3 吗?
如果现在要选定一个解释器,原文档的建议是:使用最新的 Python 3.x。理由非常直接——每个新版本都会带来:
- 新增或改进的标准库模块;
- 安全修复与 bug 修复;
- 语言与运行时的持续演进。
只有在下列"强理由"存在时,才值得继续使用 Python 2:
- 已有大量存量代码库无法迁移(pre-existing code-base);
- 依赖某个只有 Python 2 版本的第三方库;
- 出于简单性/熟悉度的考虑;
- 当然,如果你就是热爱并受 Python 2 启发,也无可厚非。
此外,Python 官方提供了"写一份代码同时兼容 Python 2.6、2.7 与 Python 3"的移植指南(pyporting howto)。原文档指出:这种兼容代码的难度取决于你写的软件类型,从"微不足道"到"相当困难"不等;如果你是个初学者,有远比这重要的事情要操心——先学好 Python 3 本身。
四、关键认知:Python 是一种"语言规范",而非单一实现
当人们谈论Python时,往往指的是语言加 CPython 实现,但更准确的说法是:Python 是一门可以被多种方式实现的语言规范。不同实现服务于不同的运行平台与性能目标。下表汇总本仓库文档对五种主流实现(CPython、PyPy、Jython、IronPython、PythonNet)的定位:
| 实现 | 实现语言/目标平台 | 核心原理 | 兼容版本(按文档) | 典型适用场景 |
|---|---|---|---|---|
| CPython | C 语言,参考实现 | 编译为中间字节码,由虚拟机解释执行 | 全部 Python 版本 | 默认选择、C 扩展兼容、生态最广 |
| PyPy | RPython(Python 受限静态子集) | 即时编译(JIT),多后端(C/CLI/JVM) | Python 2.7;PyPy3(beta)面向 Python 3 | 追求运行性能 |
| Jython | Java,JVM | 编译为 Java 字节码,可导入任意 Java 类 | 最高至 Python 2.7 | 与既有 Java 代码库集成 |
| IronPython | .NET 框架 | 同时使用 Python 与 .NET 库,向 .NET 其他语言暴露 Python 代码 | Python 2.7;IronPython 3 开发中(截至 2020 年 9 月未就绪) | Windows 生态、Visual Studio 集成 |
| PythonNet | C 扩展包 | 将原生 Python 安装与 .NET CLR 近乎无缝集成 | Python 2.7 与 3.5–3.8 | 非 Windows 平台(配合 Mono)接入 .NET |
下面逐一展开。
4.1 CPython:参考实现,生态兼容性的"最大公约数"
CPython 是 Python 的参考实现,用 C 编写:它将 Python 代码编译为中间字节码(bytecode),再由虚拟机解释执行。它的核心优势有二:
- 与 Python 包及 C 扩展模块的兼容性最高;
- 如果你在写开源 Python 代码并希望触达最广泛的受众,以 CPython 为目标是最佳选择。
对依赖 C 扩展(如 NumPy、Pandas 等科学计算库的底层)的包来说,CPython 甚至是唯一可选实现。原文档强调:Python 语言的所有版本都以 C 实现——因为 CPython 就是参考实现。
从仓库内部看,本项目的文档构建链路同样是典型的 CPython 生态:根目录 requirements.txt 锁定了 Sphinx==1.7.6、docutils==0.14、Jinja2==2.10 等构建依赖,而 docs/conf.py 通过intersphinx_mapping将文档链接映射到https://docs.python.org/3——注意映射目标正是Python 3 官方文档,这与"面向 Python 3"的整体基调一致。
4.2 PyPy:JIT 加持的性能取向
PyPy 是用RPython(Python 语言的一个受限静态类型子集)实现的解释器,内置即时编译器(JIT),并支持多个后端(C、CLI、JVM)。它的目标是在与 CPython 参考实现保持最大兼容的同时提升性能。
选型要点:
- 如果你的目标是提升 Python 代码的运行性能,值得给 PyPy 一次机会——原文档引用的 benchmark 数据显示其在测试集上"目前比 CPython 快 5 倍以上"(该数据源自其官方 benchmark 页面,属文档引用口径,实际收益取决于 workload 类型与对 C 扩展的依赖程度);
- 注意兼容性边界:PyPy 支持 Python 2.7,PyPy3(beta 阶段)面向 Python 3——也就是说在很长一段时间里 PyPy 在版本跟进上是滞后于 CPython 的,纯 Python 代码迁移成本低,但依赖 C 扩展的包需要专门适配。
4.3 Jython:把 Python 带到 JVM 上
Jython 将 Python 代码编译为 Java 字节码,交给 JVM 执行;更重要的是,它能像导入 Python 模块一样导入并使用任何 Java 类。
如果你的需求是:
- 与既有 Java 代码库对接;
- 或出于其他原因必须在 JVM 上写 Python;
那么 Jython 是最佳选择。需要留意的是:Jython 目前最高支持 Python 2.7(原文档脚注 [#jython_ver] 指向其 NEWS 文件确认),意味着你无法在 Jython 上使用 Python 3 的语法与标准库特性。
4.4 IronPython:.NET 世界的 Python
IronPython 是面向.NET 框架的 Python 实现:既可以同时使用 Python 与 .NET 框架的库,也可以把 Python 代码暴露给 .NET 框架中的其他语言。官方配套的 Python Tools for Visual Studio 能将其直接集成进 Visual Studio 开发环境,因此对 Windows 开发者颇具吸引力。
版本现状(按原文档及脚注):IronPython 支持 Python 2.7;IronPython 3 处于开发中,截至 2020 年 9 月尚未达到可用状态。
4.5 PythonNet:与 IronPython 互补的"逆向"方案
Python for .NET(pythonnet)是一个包,它把"原生安装的 Python"与 .NET 公共语言运行时(CLR)近乎无缝地集成起来。这与 IronPython 的思路恰好相反(IronPython 是 .NET 原生的 Python 实现),两者更多是互补而非竞争关系:
- 配合Mono,pythonnet 能让 macOS、Linux 等非 Windows 系统上的原生 Python 安装运行于 .NET 框架之内;
- 它可以与 IronPython并行共存而互不冲突;
- 兼容版本:Python 2.7 与 3.5–3.8(原文档脚注 [#pythonnet_ver1])。
五、选好解释器之后的实战链路:安装、pip 与虚拟环境
解释器选型只是第一步。《Hitchhiker's Guide》在 docs/starting/installation.rst 中给出的配套建议是:即使操作系统已自带 Python,在开始构建真实应用前,也应确保装好Setuptools、Pip 与 Virtualenv这三件套——它们能大幅降低使用第三方库的摩擦。仓库文档为三大平台分别提供了完整指南:
- Python 3 在 macOS 上的安装
- Python 3 在 Windows 上的安装
- Python 3 在 Linux 上的安装
(仓库同时保留了面向旧版 Python 2 的 legacy 安装指南目录结构:docs/starting/install/。)
5.1 快速自查与安装示例
先确认解释器与包管理工具是否就绪:
$ python3 --version # 查看 Python 3 版本 $ command -v pip3 # 确认 pip 可用以 Ubuntu 为例,安装较新 Python 3(如 3.8)可走 deadsnakes PPA:
$ sudo apt-get install software-properties-common $ sudo add-apt-repository ppa:deadsnakes/ppa $ sudo apt-get update $ sudo apt-get install python3.8其他发行版则用各自包管理器(Fedora 用sudo dnf install python3)。macOS 推荐 Homebrew:brew install python(装好即带指向该 Python 3 的pip);Windows 推荐 Chocolatey:choco install python(自动加入 PATH)。
这里有一个值得注意的命令语义陷阱:在部分 Linux 发行版(如 Ubuntu、Fedora)上,pip命令默认指向 Python 2,而pip3才指向 Python 3;Windows 上 Chocolatey 安装的 Python 3 则让python/pip直接可用。这也是为什么更推荐"用虚拟环境隔离一切"——进入虚拟环境后,python与pip都指向项目专属的解释器,这些平台差异就被消解了。
5.2 用虚拟环境解决依赖冲突
原文档用一个经典矛盾来诠释虚拟环境的价值:"项目 X 依赖版本 1.x,但项目 Y 需要 4.x"。虚拟环境为不同项目创建相互隔离的 Python 环境,既解决版本冲突,又保持全局 site-packages 干净整洁。
仓库在 docs/dev/virtualenvs.rst 给出了从 Pipenv(高层工具,类似 Node.js 的 npm / Ruby 的 bundler)到 virtualenv(底层工具)的完整阶梯:
$ pip install --user pipenv # 安装 Pipenv(--user 避免破坏系统级包) $ cd project_folder $ pipenv install requests # 安装依赖并自动创建 Pipfile 与虚拟环境 $ pipenv run python main.py # 在虚拟环境中运行脚本更底层的 virtualenv 流程则是:
$ pip install virtualenv $ cd project_folder $ virtualenv venv # 在当前目录创建隔离环境 $ source venv/bin/activate # 激活(Windows 为 venv\Scripts\activate) $ pip install requests # 此后安装的包都落在 venv 内 $ deactivate # 退出进阶配置参见 docs/dev/pip-virtualenv.rst:可通过export PIP_REQUIRE_VIRTUALENV=true(写入~/.bashrc)或 pip 配置文件(Unix 的~/.pip/pip.conf、Windows 的%USERPROFILE%\pip\pip.ini)中的require-virtualenv = true,强制 pip 只在虚拟环境内安装,杜绝"以为装进项目、实际装进全局"的混乱;再定义一个gpip()函数临时放行全局安装。环境一致性则靠pip freeze > requirements.txt与pip install -r requirements.txt双向保证——这正是本仓库 requirements.txt 的来历。
六、把选型决策落到日常:一份速查清单
综合原文档建议,给出如下决策速查:
- 新项目、绝大多数情况→ 最新版 Python 3.x + CPython;
- 追求纯 Python 代码运行性能→ 尝试 PyPy(先确认依赖不含未适配的 C 扩展);
- 必须融入 JVM 生态→ Jython(注意最高只到 Python 2.7);
- 必须融入 .NET 生态:
- Windows + Visual Studio 深度集成 → IronPython(Python 2.7,3 尚在开发);
- 原生 Python + .NET CLR 桥接、含 macOS/Linux(配合 Mono)→ PythonNet(2.7 与 3.5–3.8);
- 任何场景→ 装齐 Setuptools、pip,并用虚拟环境(Pipenv / virtualenv)隔离项目依赖。
需要强调的是,上述各实现的版本兼容范围均以本仓库 docs/starting/which-python.rst 成文时的记录为准(Jython 至 2.7、PythonNet 至 3.8、IronPython 3 截至 2020 年 9 月未就绪)。当你读到本文时,各实现可能已发布新版本——在实际决策前,请以各实现官方发布页的最新信息为准。这也是《Hitchhiker's Guide to Python》文档站点持续更新、并以 runtime.txt 固定构建版本的原因:解释器世界在演进,选型判断要与时俱进。
七、结语
选择解释器不是一次性的仪式,而是贯穿开发周期的基础设施决策:以 Python 3 + CPython 为默认盘,以性能、平台与生态集成需求为换挡依据。掌握了本文的解释器全景、平台安装链路与虚拟环境隔离手段,你就有了从"随便装了个 Python"到"为项目精确配好运行环境"的完整能力。想要进一步深入,可以在仓库中继续阅读 安装总览、虚拟环境专题 与 pip 进阶配置,把开发环境的每个环节都打磨到位。
【免费下载链接】python-guidePython best practices guidebook, written for humans.项目地址: https://gitcode.com/gh_mirrors/py/python-guide
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考