应优先使用 sys.version_info 进行版本判断,因其是稳定可靠的 namedtuple;sys.version 适合日志输出,platform.python_version() 适合需标准字符串格式的场景。

sys.version 返回的是字符串,不是结构化数据
sys.version 确实能拿到版本信息,但它返回的是一个带空格和括号的长字符串,比如 '3.11.9 (main, Apr 18 2024, 16:57:54) [Clang 15.0.0 (clang-1500.3.9.4)]'。直接用它做版本比较或提取主次版本号容易出错。
常见错误是写 sys.version.startswith('3.11') —— 看似可行,但一旦系统里有多个 Python 安装、或者字符串格式因构建方式微调(比如加了 +debug 后缀),就可能漏判。
- 真正需要判断版本时,优先用
sys.version_info,它是namedtuple,支持元组比较:sys.version_info >= (3, 11) - 要拼接显示用的字符串,
sys.version可读性好,适合日志输出;但别拿它做逻辑分支 -
sys.version_info.major、.minor、.micro字段稳定可靠,不会受编译参数影响
区分 sys.version、sys.version_info 和 platform.python_version()
这三个都跟版本有关,但来源和用途不同:
-
sys.version:启动时由解释器填充,含编译时间、编译器等额外信息,适合人工查看 -
sys.version_info:只含版本数字和 release level,是唯一推荐用于条件判断的接口 -
platform.python_version():调用sys.version_info拼接而成,返回标准格式字符串如'3.11.9',比sys.version干净,但多一次函数调用开销
如果你在写兼容性检查代码(比如要求至少 Python 3.9),必须用 sys.version_info;如果只是打日志或配置文件里记录版本,platform.python_version() 更简洁。
立即学习“Python免费学习笔记(深入)”;
在 shebang 或命令行中不能用 sys 模块
想在 shell 脚本里快速查当前 Python 版本?别写 python -c "import sys; print(sys.version)" —— 这样没问题,但更轻量的是直接用 -V 参数:
python -V
它输出 Python 3.11.9,不含多余信息,且不触发 Python 解释器完整初始化,启动更快。如果需要机器可解析的纯数字格式(比如 CI 脚本里提取主版本),可用:
python -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')"
注意:不要用 python --version 做自动化解析,因为某些发行版(如 Ubuntu 的 python3 包)会把输出重定向到 stderr,且格式不保证一致。
虚拟环境里获取的是当前激活解释器的版本,不是系统默认版本
很多人误以为 sys.version 显示的是系统级 Python 版本,其实它永远反映当前正在运行的解释器本身。在 venv 或 conda 环境中执行,得到的就是该环境解释器的版本,哪怕你用 python3.9 激活了一个 3.9 环境,sys.version_info 就是 (3, 9, x)。
这个行为本身没错,但容易被忽略的点是:如果你的脚本被不同环境反复调用(比如通过 cron 或 systemd),而脚本里又硬编码了对 sys.version_info 的判断,那它的行为就完全取决于调用时激活的环境 —— 不是看 /usr/bin/python3 是什么,而是看 which python 当前指向哪。


















