Pyenv – 让你轻松在多个 Python 版本之间切换

pyenv 的作用

  • 用于安装并切换多个 Python 版本,独立于系统自带的 Python。
  • 常见工作流:
    • pyenv 管解释器版本 → venvpyenv-virtualenv 管环境 → Poetry/PDM/pip-tools 管依赖。
    • 匹配生产运行时(例如特定的 3.x.y 版本),或在同一台机器上同时使用新旧版本。
  • 有些人也用它来构建经过优化的解释器(LTO、原生 CPU 标志),或者保持系统的 site-packages 干净。

对 pyenv 的批评与注意事项

  • 主要顾虑:它通常会从源码编译 CPython,这会:
    • 需要构建工具链和库;如果没有仔细配置,在 macOS 和 Linux 上经常会失败。
    • 在容器中使用时会增加 CI 时间和镜像体积。
  • shims 又增加了一层,PATH / 解析 bug 可能会藏在这里。
  • 一些运维/开发者表示,他们反复通过移除 pyenv 来修复“神秘”的 Python 问题;他们把它看作一种包装器,会增加故障模式,更适合专家而不是新手。
  • 也有人反驳说,构建 Python 很简单,他们多年来使用 pyenv 一直没问题,并且重视这种细粒度控制。

Python 版本与环境的替代方案

  • 系统 Python + venv:很多人主张对大多数工作来说,python3.X -m venv .venv 加 requirements 文件就足够了;简单且内置。
    • 反方观点:venv 只会使用已经安装好的解释器,而且通常会符号链接到它们,因此操作系统/安装器升级可能会悄悄改变运行时。
  • 多语言管理器:asdf 和 mise 可以把 Python 与 Node、Ruby 等一起管理;一些人更喜欢 mise,因为性能更好、CLI 更友好,而且经常复用 asdf/pyenv 插件。
  • Conda/mamba/pixi:在需要非 Python 二进制文件(CUDA、地理空间栈)的场景里仍然很受欢迎;pixi 通过 uv 增加了 lockfile 和 PyPI 支持。
  • Docker / Nix
    • Docker 被广泛用于绕开宿主机 Python 问题,尤其是在机器学习场景中配合 NVIDIA 基础镜像。
    • Nix 被强调为少数真正能够随着时间完整复现环境(Python + 系统库)的选项之一。

Python 打包的元问题

  • 许多人抱怨碎片化:pip、venv、virtualenv、conda、poetry、PDM、pipenv、Rye、uv、pipx,等等。
  • 业内共识是:没有单一的“银弹”,尤其对新手而言;建议从“就用 venv”到“就用 Docker”再到“如果你能接受复杂性就用 Nix”不等。