杰瑞科技汇

Python包管理工具有哪些?如何选择?

Python 的包管理是一个非常重要的话题,它贯穿了从项目开发、依赖管理到部署的整个生命周期,我会从核心工具、工作流程、最佳实践和未来趋势几个方面来详细讲解。

Python包管理工具有哪些?如何选择?-图1
(图片来源网络,侵删)

核心概念

在深入工具之前,先理解几个关键概念:

  1. :一个包含 Python 代码的目录,通常包含一个 __init__.py 文件,使其成为一个模块的集合。
  2. 模块:一个单一的 Python 文件(.py)。
  3. :一个或多个包的集合,提供特定的功能。
  4. 分发:将你的代码打包成可以安装和分发的格式,最常见的是 wheel (.whl) 和 source distribution (.tar.gz)。
  5. 依赖:你的项目正常运行所需要的其他包。requests 库依赖于 urllib3

核心工具

Python 的包管理生态系统主要由三个工具构成,它们协同工作,覆盖了不同的场景。

pip - 包安装器

pip 是 Python 的官方标准包安装器,它是你与 Python Package Index (PyPI) 交互的主要工具,用于安装、卸载和管理项目依赖。

基本用法:

Python包管理工具有哪些?如何选择?-图2
(图片来源网络,侵删)
# 安装一个包
pip install requests
# 安装特定版本
pip install numpy==1.21.0
# 安装最低版本
pip install "pandas>=1.3.0"
# 升级一个包
pip install --upgrade requests
# 卸载一个包
pip uninstall requests
# 查看已安装的包及其版本
pip list
# 查看某个包的详细信息
pip show requests
# 搜索 PyPI 上的包
pip search keyword  # (注意:此命令在某些版本中已被弃用,建议直接在 PyPI 网站搜索)

局限性pip 本身不擅长处理复杂的依赖关系和项目环境的隔离,这就是 venvpipfile 的用武之地。

venv - 虚拟环境

venv 是 Python 3.3+ 内置的虚拟环境管理工具,它的核心作用是创建一个隔离的 Python 环境,避免不同项目之间的包版本冲突。

为什么需要虚拟环境? 想象一下,你有一个项目 A 需要 numpy==1.20,而另一个项目 B 需要 numpy==1.25,如果你在全局环境中安装,这两个版本会互相覆盖,导致其中一个项目无法运行,虚拟环境为每个项目创建了一个独立的“沙盒”,确保依赖干净、可复现。

基本用法:

Python包管理工具有哪些?如何选择?-图3
(图片来源网络,侵删)
# 1. 创建一个名为 "my_project_env" 的虚拟环境
python -m venv my_project_env
# 2. 激活虚拟环境
# Windows
my_project_env\Scripts\activate
# macOS / Linux
source my_project_env/bin/activate
# 激活后,命令行前会出现环境名,(my_project_env) $
# 3. 在虚拟环境中安装包
pip install pandas
# 4. 退出虚拟环境
deactivate

最佳实践永远在虚拟环境中进行项目开发!

setuptools - 打包工具

setuptools 是用于将你的 Python 项目打包成可以分发的格式(如 .whl.tar.gz)的工具,当你要发布自己的包到 PyPI 时,就必须使用它。

它通过一个名为 setup.py 的脚本来定义项目的元数据(名称、版本、作者、依赖等)。

setup.py 示例:

from setuptools import setup, find_packages
setup(
    name="my-awesome-package",
    version="0.1.0",
    packages=find_packages(),
    install_requires=[
        "requests",
        "numpy>=1.20.0",
    ],
    author="Your Name",
    author_email="your.email@example.com",
    description="A small example package",
    url="https://github.com/yourusername/my-awesome-package",
)

构建和上传:

# 安装构建工具
pip install --upgrade build
# 构建包
python -m build
# 上传到 PyPI (需要先注册账号)
pip install twine
twine upload dist/*

现代工作流程:从 requirements.txtpyproject.toml

过去,我们常用 requirements.txt 来管理依赖,社区正在向更现代的 pyproject.toml 标准过渡。

requirements.txt (传统方式)

requirements.txt 是一个简单的文本文件,列出了项目运行所需的所有包及其精确版本。

生成 requirements.txt

# 将当前环境中所有包及其版本导出到文件
pip freeze > requirements.txt

安装 requirements.txt 中的依赖:

pip install -r requirements.txt

缺点

  • 不区分开发依赖(如 pytest)和生产依赖(如 django)。
  • 版本锁定方式不够灵活( vs >=)。
  • 缺乏项目配置(如构建系统、工具配置)的统一标准。

pyproject.toml (现代标准)

pyproject.toml 是一个更强大、更灵活的配置文件,它正在成为 Python 项目的标准,它不仅可以定义依赖,还可以定义构建系统、元数据、工具配置等。

pyproject.toml 示例:

[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[project]
name = "my-awesome-project"
version = "0.1.0"
authors = [
  { name="Your Name", email="your.email@example.com" },
]
description = "A small example project"
readme = "README.md"
requires-python = ">=3.8"
classifiers = [
    "Programming Language :: Python :: 3",
    "License :: OSI Approved :: MIT License",
    "Operating System :: OS Independent",
]
dependencies = [
    "requests",
    "numpy>=1.20.0",
]
# 可选:定义开发依赖
[project.optional-dependencies]
dev = [
    "pytest",
    "black",
    "flake8",
]
# 可选:定义命令行脚本
[project.scripts]
my-command = "my_awesome_project.cli:main"

如何使用 pyproject.toml

  • 依赖安装pip 会自动识别 [project.dependencies][project.optional-dependencies],你仍然可以使用 pip install -e . 来安装你的项目及其依赖。
  • 工具配置:许多现代工具(如 pytest, black, ruff)可以直接在 pyproject.toml 中进行配置,让项目配置更加集中。

最佳实践总结

  1. 始终使用虚拟环境:为每个新项目创建并激活一个虚拟环境。
  2. 明确区分开发和生产依赖
    • 使用 pip install -e . 安装你的项目(开发模式)。
    • 使用 pip install -r requirements.txt 或直接在 pyproject.toml 中定义,为生产环境安装精确的依赖。
  3. 版本锁定:在 requirements.txtpyproject.toml 中锁定依赖版本,确保环境可复现,对于 pyproject.toml,推荐使用 pip install 'package>=1.0,<2.0' 这样的写法。
  4. 优先使用 pyproject.toml:对于新项目,优先采用 pyproject.toml 作为配置标准,它更现代、更强大。
  5. venv 文件夹加入 .gitignore:虚拟环境是项目特定的,不应该被提交到代码仓库中。
    # .gitignore
    venv/
    .venv/
    ENV/
    env/
    env.bak/
    venv.bak/
  6. 使用构建工具:发布包时,使用 python -m build 来构建分发包,而不是直接运行 setup.py

高级工具与未来趋势

Poetry - 一体化项目管理工具

Poetry 是一个旨在简化 Python 项目管理的工具,它集成了虚拟环境管理、依赖解析、打包和发布等功能。

Poetry 的核心优势:

  • 统一的 pyproject.toml:所有配置(依赖、脚本、工具)都在一个文件中。
  • 智能的依赖解析:自动解决复杂的依赖冲突,生成一个确定的 poetry.lock 文件(类似 package.json.lock)。
  • 内置虚拟环境poetry new <project> 会自动创建带虚拟环境的项目。
  • 简化发布流程:一条命令即可将包发布到 PyPI。

Poetry 基本用法:

# 安装 Poetry
curl -sSL https://install.python-poetry.org | python3 -
# 创建新项目 (自动创建虚拟环境)
poetry new my-poetry-project
cd my-poetry-project
# 添加依赖
poetry add requests
poetry add pytest --group dev # 添加开发依赖
# 安装所有依赖
poetry install
# 在虚拟环境中运行命令
poetry run python my_script.py
# 构建和发布
poetry build
poetry publish

PDM - 另一个现代化的包管理器

PDM (Python Development Master) 是近年来崛起的另一个强大的包管理器,其设计理念与 Poetry 类似,但在某些方面(如使用 pdm.lock 和更快的依赖解析)有其优势。

pipx - 全局安装应用

pipx 用于安装和管理那些在隔离环境中运行的 Python 应用程序(如 black, httpie, jupyter),它既保证了全局环境的干净,又能方便地使用这些命令行工具。

# 安装 pipx
pip install pipx
# 使用 pipx 安装一个应用
pipx install black
# 运行应用
pipx run black --version

总结与选择建议

工具/概念 主要用途 优点 缺点/适用场景
pip 安装、卸载单个包 Python 标准,简单直接 不处理环境隔离和复杂依赖
venv 创建隔离的 Python 环境 内置,轻量级,避免冲突 需要手动管理 requirements.txt
setuptools 将项目打包以分发 打包的行业标准 配置 setup.py 较繁琐
requirements.txt 简单的依赖列表 广泛支持,简单易懂 功能有限,不够现代化
pyproject.toml 现代项目配置标准 统一配置,功能强大 相对较新,生态工具在逐步完善
Poetry / PDM 一体化项目管理 智能依赖解析,统一配置,简化流程 学习曲线,非标准库(但社区认可度高)
pipx 安装全局 CLI 工具 隔离应用,保持全局环境干净 不适用于库或项目依赖

如何选择?

  • 初学者 / 小型项目:掌握 pip + venv + requirements.txt 是基础,这是理解 Python 包管理最核心的组合。
  • 现代 Python 开发者 / 中大型项目:强烈推荐学习和使用 PoetryPDM,它们能极大地提升开发效率和项目管理的规范性,如果你选择手动管理,请使用 pyproject.toml 代替 requirements.txt
  • 安装全局工具:使用 pipx

Python 的包管理生态正在朝着更标准化、更智能、更集成的方向发展,从 pipPoetry/PDM,反映了开发者对更高效、更可靠的项目管理工具的持续追求。

分享:
扫描分享到社交APP
上一篇
下一篇