Python 看起来很容易上手:安装解释器,写一句 print("Hello") 就能运行。但真正进入项目后,常见问题往往不是语法,而是“我运行的到底是哪一个 Python”“包装到哪里了”“Python 2 和 3 为什么不能混用”。
本文是系列起点,面向第一次系统学习 Python、或只写过零散脚本的读者。全文以 CPython 3.14 为验证基线(验证版本 3.14.7);Python 3.15 在本文写作时仍处于预发布阶段,不作为生产教程的基线。
1. Python、CPython 和解释器是什么关系
Python 首先是一门语言:它定义语法、对象模型和标准库接口。CPython 是 Python 官方维护、使用最广泛的实现,因主要以 C 编写而得名。除此之外还有 PyPy、Jython 等实现,它们可能采用不同的执行技术或面向不同平台。
日常说“安装 Python”,多数时候指安装 CPython。执行一个 .py 文件时,可以先用下面这个简化模型理解:
| |
“解释型语言”不等于逐字逐句直接执行源码。CPython 会先把源码编译为字节码,再由解释器执行;这些实现细节也不意味着 Python 代码永远不会经过即时编译或本地代码优化,其他实现可以采用不同策略。
可以在程序里确认当前解释器:
| |
其中 sys.executable 很重要:它告诉你当前进程实际使用哪个解释器,而不是你以为终端会找到哪个解释器。
2. Python 2 和 Python 3 是一次断代
Python 3.0 不是 Python 2 的普通小升级,而是有意清理历史设计的一次不兼容演进。Python 2.7 是 2.x 的最后一个版本,已于 2020 年 1 月 1 日停止官方支持;最终发行版 2.7.18 只是汇集停更前的修复,不代表支持期延长。
今天的新项目应直接使用 Python 3。阅读旧代码时,最容易遇到这些差异:
| 主题 | Python 2 典型行为 | Python 3 现代行为 |
|---|---|---|
| 输出 | print "hello" 是语句 | print("hello") 是函数调用 |
| 整数除法 | 5 / 2 得到 2 | 5 / 2 得到 2.5,整除使用 5 // 2 |
| 文本模型 | str 默认是字节序列,另有 unicode | str 表示 Unicode 文本,bytes 表示字节 |
| 输入 | raw_input() 读取文本,input() 会求值 | input() 始终返回文本 |
| 序列工具 | range() 直接构造列表 | range() 返回惰性的范围对象 |
| 字典遍历 | dict.keys() 等通常返回列表 | 返回动态视图对象 |
| 异常语法 | 可见 except E, e 等旧写法 | 使用 except E as e |
真正棘手的通常是文本与字节边界。网络、文件和压缩数据是字节,用户看到的是文本;Python 3 强制程序明确进行编码和解码:
| |
不要为了兼容早已停更的 Python 2,在新项目中继续采用旧语法或“双版本兼容”技巧。确有遗留系统时,应把迁移作为独立工程:先建立测试,再借助静态扫描和分阶段替换处理 Unicode、依赖与行为差异。
3. 安装后先确认命令指向哪里
从 Python 官网安装当前稳定版后,先新开一个终端检查版本。Windows 通常可以使用:
| |
macOS 或 Linux 发行版经常把 Python 3 命名为 python3:
| |
不同操作系统、安装方式和 PATH 配置可能产生不同命令名,文章后面统一写 python。如果你的环境只有 python3,请对应替换。不要通过删除系统自带解释器来“修复”命令冲突;先用上述发现命令确认路径,再调整用户级 PATH 或使用解释器绝对路径。
还要区分下面三个版本:
| |
- 第一条确认语言运行时版本;
- 第二条同时显示
pip版本及其安装位置,可判断它是否属于当前解释器; - 第三条用于观察当前环境与基础解释器的位置。
优先写 python -m pip,而不是裸用 pip。前者明确要求“由这个 Python 运行它所关联的 pip 模块”,多解释器并存时更不容易装错环境。
4. 用虚拟环境隔离每个项目
虚拟环境不是虚拟机,也不会复制完整操作系统。它在一个目录中记录基础解释器,并为项目提供独立的可执行入口和 site-packages。标准库模块 venv 足以创建它:
| |
在 Windows PowerShell 中可以激活:
| |
若本机策略不允许执行激活脚本,不必为了一个项目修改全局执行策略。激活本质上只是把虚拟环境目录提前放进 PATH,可以直接使用完整路径:
| |
在 Bash 中对应为:
| |
激活后验证:
| |
输出 True 表示当前解释器运行在虚拟环境中。.venv/ 应加入版本控制忽略列表;虚拟环境被设计成可删除、可重建,也不应复制到另一台机器。
5. REPL、脚本和模块入口
直接运行 python 会进入交互式解释器(REPL),适合验证表达式:
| |
业务代码应保存为脚本。例如 app.py:
| |
然后执行:
| |
当文件被直接执行时,模块名 __name__ 是 "__main__";当它被别的模块导入时,__name__ 是实际模块名。因此入口保护能避免“导入函数时顺便启动程序”。
对于包中的模块,更推荐从项目根目录通过模块名启动:
| |
-m 会按导入系统定位模块,并正确建立包上下文;直接运行包内部某个文件,容易造成相对导入失败或产生两套不同的导入路径。
6. 一个可重复的最小工作流
第一次建立项目时,可以遵循下面的闭环:
| |
创建 converter.py:
| |
先做语法编译检查,再运行:
| |
py_compile 只能证明语法能够编译,不能证明业务逻辑正确。后续文章会逐步加入类型检查、自动化测试和项目配置,把“能运行”提升为“能维护”。
7. 小结
- Python 是语言,CPython 是最常用的官方实现;本文系列锁定 CPython 3.14.7。
- Python 2 已停止支持,Python 3 的文本模型、除法和标准库语义与它存在实质差异。
- 遇到环境问题,先检查
sys.executable和python -m pip --version,不要凭命令名猜测。 - 每个项目使用独立
.venv,并把环境视为可重建产物。 - 脚本用入口保护,包内程序优先通过
python -m ...启动。
下一篇将进入 Python 的核心:名称如何绑定对象、基础类型如何工作,以及控制流怎样组织程序。