Python 包的依赖管理:Pip 与 Conda 实践指南
前言
在 Python 开发中,环境管理一直是让开发者头疼的问题。相比 Node.js 拥有 Npm 和 package.json,Java 拥有 Maven/Gradle 和 pom.xml/build.gradle,Python 的生态在过去很长一段时间内缺乏统一的标准化依赖管理机制。许多小型项目直接堆砌代码,没有声明依赖或配置环境的文件。这种做法虽然简单,但随着项目规模扩大,依赖冲突、环境不一致、启动失败等问题层出不穷。
然而,随着工具链的成熟,Python 也能实现像其他语言一样规范的项目管理和环境隔离。本文将深入探讨基于 Pip 和 Conda 两种主流方案的依赖管理实践,涵盖环境配置、依赖树分析、清理治理以及跨语言环境支持。
基于 Pip 的管理方案
Pip 是 Python 官方的包安装工具,是最基础的依赖管理手段。一个完善的 Pip 工作流应能解决以下核心问题:
- 快速配置项目依赖,搭建开发环境。
- 明确当前项目依赖的第三方包及其版本。
- 清晰展示依赖树关系,便于调试冲突。
- 支持依赖的快速添加、移除及调解。
快速配置环境(pip)
查看当前环境下的已安装包列表,可以使用 pip list 命令:
$ pip list
Package Version
---------- -------------------
certifi 2020.6.20
pip 19.3.1
setuptools 44.0.0.post20200106
wheel 0.36.2
对于一个空的 Python 环境,基础通常只包含这四个包。通过该命令,我们可以确认当前环境中有哪些包及其具体版本。
为了方便说明,我们安装 Flask 作为示例:
$ pip install flask
再次查看列表:
$ pip list
Package Version
------------ -------------------
certifi 2020.6.20
click 7.1.2
Flask 1.1.2
itsdangerous 1.1.0
Jinja2 2.11.3
MarkupSafe 1.1.1
pip 19.3.1
setuptools 44.0.0.post20200106
Werkzeug 1.0.1
wheel 0.36.2
可以看到,除了 Flask 本身,还引入了 click、Jinja2 等多个间接依赖。
若要将这些信息记录下来以便复用,可以使用 pip freeze 命令生成 requirements.txt 文件:
$ pip freeze > requirements.txt
$ cat requirements.txt
certifi==2020.6.20
click==7.1.2
Flask==1.1.2
itsdangerous==1.1.0
Jinja2==2.11.3
MarkupSafe==1.1.1
Werkzeug==1.0.1
在新环境中,只需执行 pip install -r requirements.txt 即可一键还原所有依赖。
明确项目依赖(pipdeptree)
pip list 或 pip freeze 仅列出包名和版本,未展示依赖关系。这导致在清理依赖时难以判断哪些是直接依赖,哪些是间接依赖,盲目删除可能导致项目运行异常。
例如,项目中使用了 Flask,但可能不知道 Flask 强依赖 Jinja2。如果擅自删除 Jinja2,项目将无法启动。
此时可使用 pipdeptree 工具来可视化依赖树:
$ pip install pipdeptree
$ pipdeptree
certifi==2.0.20
Flask==1.1.2
- click [required: >=5.1, installed: 7.1.2]
- itsdangerous [required: >=0.24, installed: 1.1.0]
- Jinja2 [required: >=2.10.1, installed: 2.11.3]
- MarkupSafe [required: >=0.23, installed: 1.1.1]
- Werkzeug [required: >=0.15, installed: 1.0.1]
pipdeptree==2.0.0
- pip [required: >=6.0.0, installed: 19.3.1]
setuptools==44.0.0.post20200106
wheel==0.36.2


