Conda-Pyenv-Poetry 多轨管理 Python 环境

背景

Python 项目类型很多:从简单的数据分析、深度学习到 Web 开发和应用构建,每种类型对版本、环境和依赖的要求各不相同。

对于简单的项目,pip 就可以满足需求。但随着数据科学项目或应用构建项目的扩大,各项目的 Python 版本和环境间的差异越来越大,conda 虽然可以实现很好的环境管理,但它太「重」了,过于臃肿。无论是 Anaconda 还是 miniconda 都存在安装依赖库过于激进的问题,使得项目环境占用空间动辄 5-6G,出现不必要膨胀。

因此,我将我的需求分为两类。一类是用 Python 写一些数据科学相关的项目,可以使用 conda 让多个类似的项目共用一个虚拟环境,这对动辄几个 G 的机器学习依赖的管理,非常重要。另一类,是用 Python 写一些小项目,可能是 Web、爬虫,也可能是纯 Python 实现,这个时候我仅仅需要安装我需要的依赖,同时不同项目可能对 Python 的版本有要求。这时候再用 conda 就很不明智了。

为了满足以上需求,经过一系列调研,最终确定了三个工具共同来管理我的 Python 环境:CondaPyenvPoetry

最终的目标为:

  • Pyenv管理系统全局的 Python 版本,新 shell-session 的 Python 由Pyenv接管。
  • Conda负责建立可以让多个类似项目公用的虚拟环境,新 shell-session 不再默认激活 base 或者其他 Conda 环境。
  • Poetry为不同项目建立轻便独立的虚拟环境,其 Python 版本依赖 Pyenv。

2024.11.08 更新:使用Rust编写的 Python 包管理器 uv 替代了PyenvPoetry的所有功能,更加快捷。

2024.12.05 更新:uv 有点难用,还是用回PyenvPoetry

组合优势

Pyenv:灵活切换 Python 版本

  • 安装多个 Python 版本:不管是 Python 2 还是 Python 3,不同版本的 Python 在项目中的需求各不相同。通过 Pyenv,可以安装多个版本,选择一个作为全局版本,并在不同项目间快速切换。
  • 项目独立版本控制:在每个项目的根目录下创建 .python-version 文件,设置每个项目专属的 Python 版本。这样,即使在不同项目间切换,也可以保证每个项目使用对应的 Python 版本。

安装与配置

  • PowerShell - easiest way (for windows)

    Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1"
    
  • 运行pyenv --version检查安装是否成功。
  • 运行pyenv install --list检查 pyenv-win 支持的 Python 版本列表。
  • 运行pyenv install <version>以安装支持的版本。
  • 运行pyenv global <version>以设置全局 Python 版本。
  • 在当前路径下运行pyenv local <version>以设置 Python 本地版本,将版本号写入当前目录下的.python-version文件的方式(优先级高于global)。
  • 检查正在使用的 Python 版本及其路径。

    > pyenv version
    <version> (set by \path\to\.pyenv\pyenv-win\.python-version)
    
  • 检查 Python 是否允许正常。

    > python -c "import sys; print(sys.executable)"
    \path\to\.pyenv\pyenv-win\versions\<version>\python.exe
    

Conda:适合数据科学和深度学习的环境管理工具

  • 环境隔离:Conda 可以创建完全隔离的环境,每个环境中的依赖互不影响,避免了包版本冲突的问题。
  • 科学计算和深度学习:Conda 在这些领域有专门优化的库版本,比如 GPU 支持的 TensorFlow 和 PyTorch。
  • 多语言支持:不仅可以管理 Python 包,也支持 R、Ruby 等语言的包。

安装与配置

这里使用的是针对 conda-forge 的 Conda 和 Mamba 的最小安装程序 Miniforge,预配置了以下功能:

  • 基础环境中的包来自 conda-forge 频道。
  • conda-forge 频道被设置为默认(也是唯一)的频道。

Miniforge 安装程序在此处可用:https://github.com/conda-forge/miniforge/releases

在 Windows 上,Miniforge 默认不会添加到系统路径中。

  • 在这种情况下,从普通命令提示符中无法使用 conda / mamba,除非提供可执行文件的完整路径,例如C:\Users\myusername\miniforge3\condabin\conda。相反,建议使用从开始菜单可用的 Miniforge Prompt。
  • 如果需要,在安装后可以手动将C:\Users\myusername\miniforge3\condabin文件夹添加到路径环境变量中,以便更方便地从任何命令提示符中使用该软件,并尽可能减少软件冲突的机会。

注意一

环境配置还需要关闭自动激活 base 环境 conda config --set auto_activate_base false。 这样每次打开终端默认的都是 pyenv 提供的 Python,而非 conda 的 base 环境了。

注意二

默认情况下,Windows PowerShell 在启动时会加载 conda 的路径。因此,我们需要确保 pyenv 的 Python 在 PATH 中优先于 conda。 即将 pyenv 的路径移动到 Path 的最前面,确保它优先于 conda 的路径。

Poetry:依赖管理和项目打包的理想工具

Poetry 轻便且强大,使用 pyproject.toml 和 poetry.lock 文件来管理依赖,类似于 JavaScript/Node.js 的 Npm 和 Rust 的 Cargo,这俩都是非常成熟好用的依赖管理方案。 因其本身并不具有管理 Python 解释器的功能,因此推荐和 pyenv/pyenv-win 一起使用,可以轻松下载和设置不同版本的 Python 解释器。

  • 依赖解析和锁定:Poetry 会自动解析和锁定依赖,避免不同版本之间的兼容性问题。
  • 项目打包和发布:可以直接把项目打包并发布到 PyPI,适合需要发布的小型工具或 Web 应用。
  • 自动创建虚拟环境:Poetry 可以在项目目录中自动创建虚拟环境,简化了环境配置过程。

安装与配置

pipx 用于全局安装 Python CLI 应用程序,同时仍将它们隔离在虚拟环境中。pipx 当用于安装 Poetry 时将管理升级和卸载。

  • 如果 pipx 还未安装,您可以按照官方 pipx 安装说明中的任何一种选项进行操作。任何非古老版本的 pipx 都可以。
  • 使用 pipx 安装 Portry

    pipx install poetry
    

总结

  • Pyenv:负责 Python 版本管理,解决不同项目对 Python 版本的需求。
  • Conda:适合数据科学、深度学习等依赖复杂的项目,确保环境隔离和依赖兼容。
  • Poetry:用于依赖管理和打包,适合 Web 开发和小型应用项目,支持依赖锁定和发布。



    Enjoy Reading This Article?

    Here are some more articles you might like to read next:

  • 部署用于学术研究的 Linux 服务器
  • Python 项目中高效管理路径的范式
  • Python 高级用法记录
  • 工作环境系统实用配置记录
  • 中文文案排版指南