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

核心概念
在深入工具之前,先理解几个关键概念:
- 包:一个包含 Python 代码的目录,通常包含一个
__init__.py文件,使其成为一个模块的集合。 - 模块:一个单一的 Python 文件(
.py)。 - 库:一个或多个包的集合,提供特定的功能。
- 分发:将你的代码打包成可以安装和分发的格式,最常见的是 wheel (
.whl) 和 source distribution (.tar.gz)。 - 依赖:你的项目正常运行所需要的其他包。
requests库依赖于urllib3。
核心工具
Python 的包管理生态系统主要由三个工具构成,它们协同工作,覆盖了不同的场景。
pip - 包安装器
pip 是 Python 的官方标准包安装器,它是你与 Python Package Index (PyPI) 交互的主要工具,用于安装、卸载和管理项目依赖。
基本用法:

# 安装一个包 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 本身不擅长处理复杂的依赖关系和项目环境的隔离,这就是 venv 和 pipfile 的用武之地。
venv - 虚拟环境
venv 是 Python 3.3+ 内置的虚拟环境管理工具,它的核心作用是创建一个隔离的 Python 环境,避免不同项目之间的包版本冲突。
为什么需要虚拟环境?
想象一下,你有一个项目 A 需要 numpy==1.20,而另一个项目 B 需要 numpy==1.25,如果你在全局环境中安装,这两个版本会互相覆盖,导致其中一个项目无法运行,虚拟环境为每个项目创建了一个独立的“沙盒”,确保依赖干净、可复现。
基本用法:

# 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.txt 到 pyproject.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中进行配置,让项目配置更加集中。
最佳实践总结
- 始终使用虚拟环境:为每个新项目创建并激活一个虚拟环境。
- 明确区分开发和生产依赖:
- 使用
pip install -e .安装你的项目(开发模式)。 - 使用
pip install -r requirements.txt或直接在pyproject.toml中定义,为生产环境安装精确的依赖。
- 使用
- 版本锁定:在
requirements.txt或pyproject.toml中锁定依赖版本,确保环境可复现,对于pyproject.toml,推荐使用pip install 'package>=1.0,<2.0'这样的写法。 - 优先使用
pyproject.toml:对于新项目,优先采用pyproject.toml作为配置标准,它更现代、更强大。 - 将
venv文件夹加入.gitignore:虚拟环境是项目特定的,不应该被提交到代码仓库中。# .gitignore venv/ .venv/ ENV/ env/ env.bak/ venv.bak/ - 使用构建工具:发布包时,使用
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 开发者 / 中大型项目:强烈推荐学习和使用
Poetry或PDM,它们能极大地提升开发效率和项目管理的规范性,如果你选择手动管理,请使用pyproject.toml代替requirements.txt。 - 安装全局工具:使用
pipx。
Python 的包管理生态正在朝着更标准化、更智能、更集成的方向发展,从 pip 到 Poetry/PDM,反映了开发者对更高效、更可靠的项目管理工具的持续追求。
