AI 教我学 Python(04):包管理与模块管理

1.Python 的版本管理

使用 pyenv 升级 Python (推荐)

  1. 安装 pyenv (如果还没有安装的话):
  • 推荐使用 Homebrew 安装:
    brew update
    brew install pyenv
  • 安装后,根据 brew info pyenv 的提示,将必要的初始化脚本添加到你的 shell 配置文件中(通常是 ~/.zshrc~/.bash_profile),例如:
    # 对于 zsh (默认 macOS shell)
    echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
    echo '[[ -d "$PYENV_ROOT/bin" ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
    echo 'eval "$(pyenv init -)"' >> ~/.zshrc
  • 重启你的终端 或运行 source ~/.zshrc (或相应文件) 使配置生效。
  1. 查看可安装的 Python 版本:
pyenv install --list

找到你想要安装的 3.12+ 版本,比如 3.12.3

  1. 安装新的 Python 版本:
pyenv install 3.12.3

这可能需要一些时间,因为它会从源码编译 Python。

  1. 设置全局或项目 Python 版本:
  • 设置全局默认版本 (所有未使用特定版本的项目都会用这个):
    pyenv global 3.12.3
  • 为当前项目设置本地版本 (推荐): 进入你的项目目录 (fastapi-project),然后运行:
    pyenv local 3.12.3
    这会在项目目录下创建一个 .python-version 文件。
  1. 验证 Python 版本:
python --version
# 或者 python3 --version

确保它显示的是你刚刚安装和设置的版本 (e.g., Python 3.12.3)。

重要:升级 Python 后的步骤

升级 Python 版本后,你必须为你的项目使用新的 Python 版本重新创建虚拟环境并重新安装依赖:

  1. 删除旧的虚拟环境: 在你的项目目录 (fastapi-project) 中,删除旧的 .venv 文件夹:
rm -rf .venv
  1. 创建新的虚拟环境: 使用你新安装的 Python 版本创建:
python -m venv .venv
# 或者 python3 -m venv .venv
  1. 激活新的虚拟环境:
source .venv/bin/activate
  1. 重新安装所有依赖:

如果你有 requirements.txt 文件:

pip install -r requirements.txt

或者手动安装需要的库:

pip install fastapi uvicorn supabase python-dotenv psycopg2 alembic # 以及其他你需要的库

2. Python 还有哪些常用的包管理器?详细说明并对比

Python生态系统中有几种不同的包管理工具,类似于JavaScript世界中的npm、yarn和pnpm。Python包管理器全面对比分析如下:

概述表格

特性pipcondapoetrypipenvuvhatchpdmrye
实现语言PythonPythonPythonPythonRustPythonPythonRust
解析速度中等中等极快(10-100x pip)中等
锁文件无(需pip-tools)environment.ymlpoetry.lockPipfile.lockuv.lockhatch.lockpdm.lockrequirements.lock
环境管理需配合venv内置内置内置内置内置内置内置
依赖解析简单强大强大较好极强(PubGrub)良好强大(PEP 665)强大
发布支持需twine支持内置内置内置内置内置
工具执行内置
Python版本管理内置内置
工作区支持有限强大
首次发布20082012201820172023202220192022
社区活跃度极高中等极高(50.5k★)

速度排名:uv >>> rye/pdm > poetry/hatch > conda > pipenv > pip

纵向比较(历史演进)

第一代:基础包管理

pip:Python的官方包管理器,简单直接但功能有限。虽然易于使用,但缺乏依赖解析、环境管理和锁文件等现代化功能。至今仍是许多工具链的基础。

第二代:环境管理

conda:起源于科学计算社区,解决了pip的主要缺点 - 环境隔离和包依赖问题。能同时管理Python和非Python包(如C库),特别适合数据科学。但conda解决方案较重,解析速度一般。

第三代:项目管理

pipenv 和 poetry:引入了项目级依赖管理和锁文件概念,让Python项目更接近npm或Cargo的体验。

  • pipenv:首个合并依赖管理和环境创建的工具,但开发放缓。
  • poetry:提供更完整的项目创建、发布工作流,解决了pipenv的性能问题,更现代化的依赖解析。

第四代:高效专业工具

pdm、hatch、rye 和 uv:采用现代解析算法,支持多项目工作区,更遵循Python打包标准(PEP)。

  • pdm:首个采用PEP 582(无虚拟环境依赖隔离)的工具
  • hatch:注重易用性和项目管理的全功能工具
  • rye:由Rust工具链开发者创建,注重DX和可靠性
  • uv:最新一代,由Ruff团队用Rust开发,性能极佳

横向比较(功能对比)

性能与速度

  1. uv:绝对领先,在各种基准测试中比pip快10-100倍
  2. rye/pdm:较快,但不及uv
  3. poetry/hatch:中等速度
  4. conda/pipenv:较慢,特别是依赖解析

依赖解析

  1. uv/poetry/pdm:使用先进的PubGrub算法,解析更准确可靠
  2. conda:复杂环境下仍有优势,特别是混合语言项目
  3. pip:基础解析,容易出现依赖地狱

全生命周期支持

  1. uv/poetry/hatch:支持从项目创建、依赖管理到构建发布的全流程
  2. rye:类似,注重开发体验
  3. pdm:全流程支持但偏向依赖管理
  4. pip/pipenv:主要关注安装环节

工具集成

  1. uv:集成度最高,一个工具可替代pip、pip-tools、pipx、poetry、pyenv、virtualenv等
  2. conda:环境和包管理集成良好
  3. poetry/rye:项目管理和发布工具集成
  4. pip:需配合其他工具使用

适用场景

pip

  • 适合:简单脚本、小型项目、需要与现有工具链兼容
  • 不适合:复杂依赖管理、团队协作项目

conda

  • 适合:数据科学、机器学习、需要非Python依赖的项目
  • 不适合:纯Python应用、轻量级项目、CI/CD环境

poetry

  • 适合:中大型应用开发、需要发布到PyPI的库
  • 不适合:数据科学、极高性能要求

pipenv

  • 适合:熟悉Pipfile格式的团队、较为稳定的项目
  • 不适合:新项目、需要高性能的场景

uv

  • 适合:对性能要求高的项目、CI/CD环境、希望简化工具链的团队
  • 不适合:需要图形界面、非常规Python包

pdm/hatch/rye

  • 适合:希望采用最新Python打包标准的现代化项目
  • 不适合:需要广泛兼容性的项目

企业选型建议

初创公司

🌟 推荐uv 或 poetry

  • uv提供极致性能和简化工具链
  • poetry生态成熟,文档全面

大型企业

🌟 推荐uv + conda

  • uv用于应用开发和CI/CD
  • conda用于数据科学和特殊环境

数据科学团队

🌟 推荐conda 或 uv

  • conda生态系统成熟,与Jupyter集成良好
  • uv性能更好,支持Python版本管理

DevOps/平台团队

🌟 推荐uv

  • 极致性能对CI/CD至关重要
  • 工具集成减少维护负担

未来趋势

  1. Rust实现工具兴起:uv和rye代表性能导向的新趋势,预计会逐渐获得更多市场份额
  2. 工具统一化:向uv这样能替代多个工具的解决方案会更受欢迎
  3. 标准化:更多工具会采用PEP标准,提高互操作性
  4. 云原生集成:包管理工具会进一步优化容器化和CI/CD流程

从CTO角度,我建议关注uv的发展 - 作为Ruff团队的产品,已获50.5k GitHub星标 (https://github.com/astral-sh/uv),解决了Python生态系统中长期存在的性能问题,且能替代多个工具,简化工具链并提高效率。对于新项目,uv是很有竞争力的选择;而对于现有项目,可考虑逐步迁移测试。

uv官网

3.pyenv 是什么?和 nvm 有什么区别?

pyenv 是 Python 版本的管理工具,与 Node.js 世界中的 nvm 有许多相似之处。如果你已经熟悉 nvm,理解 pyenv 将会很直观。

pyenv 基本概念

pyenv 是一个 Python 版本管理工具,它允许你:

  1. 在系统上安装和管理多个 Python 版本
  2. 为每个项目设置特定的 Python 版本
  3. 覆盖全局 Python 版本
  4. 创建隔离的 Python 环境(类似于 virtualenv)

pyenv vs nvm 详细对比

特性pyenvnvm
管理对象Python 解释器版本Node.js 版本
工作原理通过修改 PATH 环境变量和 shims通过修改 PATH 环境变量
配置文件.python-version.nvmrc
范围设置支持全局、本地和 shell 会话范围支持全局和 shell 会话范围
环境隔离需要与 virtualenv/venv 配合node_modules 自动隔离包
包管理器集成不直接管理包(需配合 pip 等)集成 npm/yarn
版本获取从源码编译或下载预编译版本下载预编译二进制版本
实现语言BashBash
自动切换自动根据 .python-version 切换自动根据 .nvmrc 切换
操作系统支持主要面向 Unix-like 系统主要面向 Unix-like 系统

pyenv 基本用法

# 安装 pyenv (MacOS)
brew install pyenv

# 查看可用的 Python 版本
pyenv install --list

# 安装特定 Python 版本
pyenv install 3.10.0

# 设置全局 Python 版本
pyenv global 3.10.0

# 为当前目录设置 Python 版本(创建 .python-version 文件)
pyenv local 3.8.12

# 为当前 shell 会话设置 Python 版本
pyenv shell 3.9.7

# 列出所有已安装的 Python 版本
pyenv versions

# 显示当前激活的 Python 版本
pyenv version

nvm 相应用法对比(如果你已经熟悉)

# 安装 nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

# 查看可用的 Node.js 版本
nvm ls-remote

# 安装特定 Node.js 版本
nvm install 16.13.0

# 设置全局 Node.js 版本
nvm alias default 16.13.0

# 为当前目录设置 Node.js 版本(创建 .nvmrc 文件)
echo "14.18.1" > .nvmrc
nvm use

# 为当前 shell 会话设置 Node.js 版本
nvm use 14.18.1

# 列出所有已安装的 Node.js 版本
nvm ls

# 显示当前激活的 Node.js 版本
nvm current

主要区别

  1. 环境隔离的处理方式

    • nvm:管理 Node.js 版本,但包管理由 npm/yarn 自动在项目级隔离(node_modules)
    • pyenv:仅管理 Python 版本,不处理包隔离,通常需要结合 virtualenv/venv 使用
  2. 配合包管理器的方式

    • nvm + npm:默认集成,无需额外配置
    • pyenv + pip:需要额外工具配合
    # pyenv  virtualenv 配合使用(推荐)
    pyenv install 3.10.0
    pyenv local 3.10.0
    python -m venv .venv
    source .venv/bin/activate  # 激活虚拟环境
    pip install requests  # 在隔离环境中安装包
  3. 原生的插件扩展

    • pyenv:有 pyenv-virtualenv 插件,简化虚拟环境管理
    # 使用 pyenv-virtualenv 插件
    pyenv virtualenv 3.10.0 my-project-env
    pyenv local my-project-env  # 自动激活/切换环境

pyenv-virtualenv:实现类似 nvm 的体验

为了获得更接近 nvm 的体验,推荐使用 pyenv-virtualenv 插件:

# 安装插件
brew install pyenv-virtualenv

#  .zshrc  .bashrc 中添加
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

# 创建虚拟环境并与 Python 版本绑定
pyenv virtualenv 3.10.0 my-project-env

# 为项目自动激活环境
pyenv local my-project-env

何时使用 pyenv

  1. 开发多个使用不同 Python 版本的项目
  2. 测试库在多个 Python 版本上的兼容性
  3. 使用最新 Python 功能,而不更改系统 Python
  4. 在不支持 Docker 的环境中管理 Python 版本

何时选择其他工具

  1. 如果只需要包隔离:仅使用 virtualenv/venv
  2. 如果同时需要包管理和环境隔离:可考虑 conda 或 Poetry
  3. 如果在 CI/CD 环境中:可能更适合使用 Docker

总结:从前端开发者角度看 pyenv

对于有 Node.js 背景的开发者,可以这样理解:

  • pyenvnvm(版本管理)
  • virtualenv/venvnode_modules(依赖隔离)
  • pipnpm install(包安装)
  • requirements.txtpackage.json(依赖列表)

如果你习惯了 nvm 的工作流程,建议组合使用 pyenv + pyenv-virtualenv,这会给你提供最接近 Node.js 开发体验的 Python 版本管理方式。