Python 提供了多种用于环境和包管理的工具,每种工具都有其独特的优势和使用场景。作为一名开发者,选择合适的工具可以显著优化创建新项目和管理依赖项的工作流程。在本文中,我们将从以下角度对比最流行的工具Conda、Poetry、uv 和 virtualenv:

  1. 总体介绍

  2. 创建新项目

  3. 设置现有项目

  4. 管理包

  5. 构建和发布包

Conda、Venv、UV 和 Poetry 对比

让我们先总体了解每种工具。我们将探讨它们的目的,以及它们的主要优势和劣势。

1. Conda

  • 目的:环境管理和包管理(包括 Python 和非 Python 依赖项)。

  • 优势

    • 支持跨语言(例如 R、C 库)。

    • 为科学计算/数据科学堆栈(如 NumPy、SciPy、TensorFlow)提供预编译二进制文件。

    • 复杂环境的稳健依赖解析。

  • 劣势

    • 占用较大的磁盘空间。

    • 比轻量级替代方案慢。

    • 如果使用不当,可能与 pip 冲突。

  • 最佳适用场景:数据科学、科学计算或需要非 Python 库的项目。


2. Venv(Python 内置模块)

  • 目的仅提供轻量级虚拟环境(无内置包管理)。

  • 优势

    • 随 Python 一起提供(无需额外安装)。

    • 开销最小,流程简单。

    • piprequirements.txt 无缝集成。

  • 劣势

    • 无包管理(需要 pip)。

    • 依赖解析仅限于 pip 的能力。

    • 手动激活/停用环境。

  • 最佳适用场景:简单项目、快速环境隔离或避免第三方工具的场景。


3. UV(Astral)

  • 目的极快的 pip/pip-tools/virtualenv 替代工具(基于 Rust)。

  • 优势

    • 极速(比 pip/pip-tools 快 10-100 倍)。

    • 结合了 virtualenv、包安装和依赖解析。

    • 兼容 requirements.txtpyproject.toml

  • 劣势

    • 相对较新(可能缺乏小众功能)。

    • 主要针对速度优化,而非复杂工作流程。

  • 最佳适用场景:高性能工作流程、大型项目、CI/CD 流水线。


4. Poetry

  • 目的依赖管理 + 打包/发布(一体化工具)。

  • 优势

    • 使用统一的 pyproject.toml 管理依赖项、打包和元数据。

    • 使用 lockfile(poetry.lock)进行高级依赖解析。

    • 自动创建/管理虚拟环境。

    • 内置包构建和发布到 PyPI 的功能。

  • 劣势

    • 学习曲线较陡。

    • 对于非打包应用程序可能过于复杂。

    • 不适合非 Python 依赖项。

  • 最佳适用场景:应用/库开发、发布包、严格依赖控制。


关键对比表

特性 Conda Venv UV Poetry
环境管理
包管理 ✅ (Conda) ❌ (使用 pip) ✅ (兼容 pip) ✅ (Poetry)
非 Python 依赖项
锁文件 ✅ (uv pip compile) ✅ (poetry.lock)
速度 ⏳ 慢 ⚡ 快(环境) ⚡⚡⚡ 极速 ⏳ 中等
CI/CD 优化 ⚠️(需要 pip) ⚠️
打包/发布
内置 Python 是(3.3+)

推荐方案

  • 使用 Conda:适用于机器学习/数据科学项目,需要 CUDA 或非 Python 依赖项。

  • 使用 Venv:适用于简单脚本或避免第三方工具的场景。

  • 使用 UV:适用于对速度要求高的工作流程、大型项目或替代 pip

  • 使用 Poetry:适用于需要严格依赖控制的可发布库/应用程序开发。


创建项目的逐步对比

在我们了解了每种工具的基本情况后,现在来探讨和对比它们在日常开发任务中的使用方式。我们将从如何使用每种工具创建新项目开始。

1. Conda

工作流程:以环境为中心,支持跨平台包。

# 创建环境(指定 Python 版本)
conda create --name my_project python=3.11
# 激活环境
conda activate my_project
# 安装包(通过 Conda 或 pip)
conda install requests  # 从 Conda Forge 安装
# 或
pip install requests
# 导出环境(确保可复现)
conda env export > environment.yml  # 包括操作系统特定依赖项

关键文件environment.yml(用于重建环境)。


2. Venv + pip

工作流程:轻量级隔离 + pip 管理包。

# 创建虚拟环境
python -m venv venv
# 激活环境
source venv/bin/activate  # Linux/macOS
.\venv\Scripts\activate  # Windows
# 安装包
pip install requests
# 冻结依赖项
pip freeze > requirements.txt
# 完成后停用环境
deactivate

关键文件venv/(隔离环境)、requirements.txt


3. UV

工作流程:统一的高速 pip/virtualenv 替代工具。

# 一条命令创建环境并安装包
uv venv venv  # 创建虚拟环境
source venv/bin/activate  # 激活
# 安装包(快速并行安装)
uv pip install requests
# 生成锁定依赖项
uv pip compile requirements.txt -o requirements.lock  # 可选锁文件
# 另一种方法:使用 pyproject.toml
echo 'requests = "^2.32"' > pyproject.toml
uv pip install -e .  # 以可编辑模式安装项目

关键文件venv/requirements.lock(可选)、pyproject.toml


4. Poetry

工作流程:依赖解析 + 打包 + 发布。

# 创建新项目(交互式设置)
poetry new my_project
cd my_project
# 初始化环境(首次安装时自动创建)
poetry env use 3.11
# 添加依赖项
poetry add requests  # 自动更新 pyproject.toml 和 poetry.lock
# 安装所有依赖项(如果缺少环境则创建)
poetry install
# 激活环境
poetry shell

关键文件

  • pyproject.toml(依赖项、元数据)

  • poetry.lock(固定依赖项)

  • my_project/(包结构)。


关键差异总结

操作 Conda Venv + pip UV Poetry
创建环境 conda create --name ... python -m venv venv uv venv venv 自动在 poetry install 时创建
添加依赖项 conda install/pip pip install uv pip install poetry add
锁定依赖项 conda env export(宽松) pip freeze(基础) uv pip compile(锁文件) poetry.lock(自动)
激活环境 conda activate source venv/bin/activate 与 Venv 相同 poetry shell
核心配置文件 environment.yml requirements.txt pyproject.toml(可选) pyproject.toml + poetry.lock
优势 非 Python 依赖项、二进制文件 简单,无需额外工具 极速 + 兼容性 打包 + 严格依赖项

重要最佳实践

  1. 不要将环境文件夹提交到 Git

    • .gitignore 应包含:

      /venv/  
      .conda/  
      .python-version  
      __pycache__/
      
  2. 在生产环境中优先使用锁文件

    # 部署时始终使用:
    uv pip install -r requirements.lock        # UV  
    poetry install --no-dev --sync             # Poetry (v1.5+)
    
  3. 缺少文件时的恢复

    • 没有 requirements.txt?通过以下方式生成:

      # 对于 Venv/UV 项目
      pip freeze > requirements.txt  
      # 对于 Poetry 项目
      poetry export -f requirements.txt --without-hashes > requirements.txt
      

包管理:添加/删除对比

在日常开发中,添加或删除包是常见任务。让我们回顾一下每种工具是如何处理这些任务的。

1. Conda

添加包

conda install requests        # 从默认渠道安装  
conda install -c conda-forge tensorflow  # 从特定渠道安装  

删除包

conda remove requests  
  • 注意事项

    • 使用 conda list 验证已安装的包

    • 混合使用 conda installpip install 可能导致冲突


2. Venv + pip

添加包

pip install requests  
# 安装开发依赖项:
pip install pytest --upgrade  # 可选版本指定  

删除包

pip uninstall requests  
  • 注意事项

    • 手动更新 requirements.txt

      pip freeze > requirements.txt
      
    • 无原生锁文件(可使用 pip-tools 生成 requirements.in/requirements.txt


3. UV

添加包

uv pip install requests        # 安装最新版  
uv pip install "requests==2.32"  # 安装特定版本  
uv pip install -e .           # 从本地 pyproject.toml 安装  

删除包

uv pip uninstall requests  
  • 锁文件工作流程

    # 生成/更新锁文件:
    uv pip compile pyproject.toml -o requirements.lock  
    # 从锁文件安装:
    uv pip install -r requirements.lock  
    

4. Poetry

添加包

poetry add requests           # 安装最新版  
poetry add requests@^2.32     # 安装特定版本  
poetry add pytest --group dev # 安装开发依赖项  

删除包

poetry remove requests  
  • 自动更新

    • 每次添加/删除依赖项时,会修改 pyproject.toml 并更新 poetry.lock

    • 安装所有依赖项:poetry install(默认包含 --with dev


关键差异总结

操作 Conda Venv + pip UV Poetry
添加包 conda install pip install uv pip install poetry add
删除包 conda remove pip uninstall uv pip uninstall poetry remove
锁文件 ❌(仅 environment.yml ❌(手动更新) uv pip compile ✅ 自动 poetry.lock
开发依赖项 conda install pytest pip install pytest uv pip install pytest poetry add pytest --group dev
版本锁定 conda install requests=2.32 pip install requests==2.32 uv pip install requests==2.32 poetry add requests@2.32
配置文件 environment.yml(手动导出) requirements.txt(手动) pyproject.toml + requirements.lock 自动 pyproject.toml/poetry.lock

关键注意事项

  1. 依赖解析

    • Poetry 和 UV 具有确定性解析器(Poetry:poetry.lock,UV:requirements.lock

    • Conda/pip 在安装时解析依赖项(可能导致环境破坏)

  2. 工作流安全性

    # 始终先创建环境(Poetry 除外):
    conda create -n my_env         # Conda  
    python -m venv venv            # Venv  
    uv venv venv                  # UV  
    # Poetry:首次运行 `install`/`add` 时自动创建环境
    
  3. 卸载边缘情况

    • Conda:可能删除其他包共享的依赖项

    • Poetry/UV:跟踪依赖树以避免破坏

💡 专业提示:对于复杂的卸载操作:

  • 从锁文件重建环境:

    conda env create -f environment.yml      # Conda  
    uv pip install -r requirements.lock      # UV  
    poetry install --no-dev                   # Poetry  
    

根据需求选择:

  • 稳定性:Poetry/UV(锁文件)

  • 速度:UV(基于 Rust,支持并行安装)

  • 简单性:Venv + pip

  • 非 Python:Conda


包构建与发布:工具对比

完成一个里程碑后,你可能希望将包发布到仓库,以便其他人可以安装和使用它。让我们回顾每种工具对此过程的支持。

简要总结

  • Conda:为 Conda 仓库构建 conda 包.tar.bz2)。

  • Venv/UV:需要 setuptools/build + twine 来发布到 PyPI。

  • Poetry:为 PyPI 包 提供统一的工作流程(wheel/sdist)。


1. 构建包

让我们从构建包开始。

Conda
# 创建配方(meta.yaml)
conda skeleton pypi my_package
conda build my_package-recipe/  # 构建 .tar.bz2
  • 产物conda-bld/linux-64/my_package-*.tar.bz2

  • 依赖conda-build

Venv + setuptools
# 安装构建工具
pip install build setuptools wheel
# 构建 wheel/sdist
python -m build  # 生成 dist/*.whl 和 dist/*.tar.gz
UV
# 通过 UV 安装工具
uv pip install build
# 使用 Python 标准库构建
python -m build  # 与 Venv 相同
Poetry
# 从 pyproject.toml 自动构建
poetry build  # 输出:dist/*.whl + dist/*.tar.gz

2. 发布包

包构建完成后,我们可以将其发布到仓库。

Conda(发布到 Anaconda Cloud)
conda install anaconda-client
anaconda login  # 认证
anaconda upload path/to/my_package-*.tar.bz2
Venv/UV(发布到 PyPI)
# 安装 twine
pip install twine
# 使用 Twine 上传
twine upload dist/*
Poetry(发布到 PyPI)
# 单命令发布
poetry publish  # 使用 poetry 配置中的 PyPI 凭据
# 可选标志
poetry publish --build  # 一步完成构建和上传

关键工作流差异

操作 Conda Venv UV Poetry
构建命令 conda build python -m build python -m build poetry build
发布命令 anaconda upload twine upload dist/* twine upload dist/* poetry publish
输出格式 .tar.bz2(conda) Wheel + sdist(PyPI) Wheel + sdist(PyPI) Wheel + sdist(PyPI)
配置文件 meta.yaml setup.py/pyproject.toml pyproject.toml pyproject.toml
认证管理 anaconda login 手动 ~/.pypirc 手动 ~/.pypirc poetry config pypi-token.pypi
依赖安装 conda install conda-build pip install build twine uv pip install build twine (内置)

关键考虑因素

  1. 平台支持

    • Conda:构建特定于操作系统的包(Linux/Windows/macOS)。

    • Poetry/Venv/UV:纯 Python 或通用 wheel(无操作系统限制)。

  2. 最佳工具选择

    • PyPI 包:Poetry(最简单)或 Venv/UV + Twine。

    • Conda 包:Conda-build(强制要求)。

    • 无需打包:无需工具(直接使用 pip/conda 安装)。

💡 专业提示:随着 pyproject.toml 成为标准(PEP 518):

  • Poetry 自动管理构建依赖项。

  • Venv/UV 需要显式安装 build

  • Conda 忽略它,除非使用 conda-build 和 pip 包装器。


总结

在从不同角度对比这些工具后,我们现在面临一个问题:在启动新项目之前,我们应该选择哪一个?如果你尚未准备好选择特定工具,可以从使用 pyproject.toml 文件开始设置项目。这允许你以与工具无关的方式定义项目配置,将环境或包管理器的选择推迟到以后。

## **安装**
```bash
# 选项 1(Poetry):
poetry install

# 选项 2(UV):
uv venv venv && uv pip install -e .[dev]

# 选项 3(Venv):
python -m venv venv && pip install -e .[dev]

# 选项 4(Conda):
conda create -n proj python=3.10
conda activate proj
pip install -e .

深耕金融科技、量化分析与 AI 金融应用!扫描下方二维码,关注【Finanalyzer】公众号,获取前沿动态、技术解析与实战案例。

qrcode

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐