Conda-Pyenv-Poetry 多轨管理 Python 环境
背景
Python 项目类型很多:从简单的数据分析、深度学习到 Web 开发和应用构建,每种类型对版本、环境和依赖的要求各不相同。
对于简单的项目,pip 就可以满足需求。但随着数据科学项目或应用构建项目的扩大,各项目的 Python 版本和环境间的差异越来越大,conda 虽然可以实现很好的环境管理,但它太「重」了,过于臃肿。无论是 Anaconda 还是 miniconda 都存在安装依赖库过于激进的问题,使得项目环境占用空间动辄 5-6G,出现不必要膨胀。
因此,我将我的需求分为两类。一类是用 Python 写一些数据科学相关的项目,可以使用 conda 让多个类似的项目共用一个虚拟环境,这对动辄几个 G 的机器学习依赖的管理,非常重要。另一类,是用 Python 写一些小项目,可能是 Web、爬虫,也可能是纯 Python 实现,这个时候我仅仅需要安装我需要的依赖,同时不同项目可能对 Python 的版本有要求。这时候再用 conda 就很不明智了。
为了满足以上需求,经过一系列调研,最终确定了三个工具共同来管理我的 Python 环境:Conda
、Pyenv
、Poetry
。
最终的目标为:
-
Pyenv
管理系统全局的 Python 版本,新 shell-session 的 Python 由Pyenv
接管。 -
Conda
负责建立可以让多个类似项目公用的虚拟环境,新 shell-session 不再默认激活 base 或者其他 Conda 环境。 -
Poetry
为不同项目建立轻便独立的虚拟环境,其 Python 版本依赖 Pyenv。
2024.11.08 更新:使用
Rust
编写的 Python 包管理器uv
替代了Pyenv
和Poetry
的所有功能,更加快捷。2024.12.05 更新:
uv
有点难用,还是用回Pyenv
和Poetry
。
组合优势
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: