我们来详细讲解一下 Python 中这四个重要的环境与依赖管理工具:Virtualenv, Pipenv, Poetry 和 Conda。
它们的目标都是解决“项目A需要库X的1.0版本,而项目B需要库X的2.0版本”这类依赖冲突和环境隔离问题,但它们的实现方式、理念和适用范围有所不同。
1. Virtualenv
是什么?
Virtualenv 是 虚拟环境管理工具 的“老祖宗”和事实标准。它的功能非常单一和专注:创建一个隔离的 Python 运行环境。
- 核心功能:创建一个文件夹(通常叫
venv或.venv),里面包含了一个特定版本 Python 的解释器副本、pip工具以及一个独立的site-packages目录(用于存放第三方库)。 - 如何使用:
- 创建环境:
virtualenv myenv(或python -m venv myenv,Python 3.3+ 内置了venv模块,功能类似) - 激活环境(Linux/macOS):
source myenv/bin/activate - 激活环境(Windows):
myenv\Scripts\activate - 激活后,用
pip install安装的包都会装在这个隔离环境里。 - 退出环境:
deactivate
- 创建环境:
优点:
- 轻量、简单、极其通用。
- 是很多其他工具(如Pipenv)的基础。
缺点:
- 只有环境隔离,没有依赖管理。你需要手动维护
requirements.txt文件来记录项目依赖(pip freeze > requirements.txt和pip install -r requirements.txt)。
定位:环境隔离的基础工具。
2. Pipenv
是什么?
Pipenv 是 Python官方推荐(曾经在PyPA首页置顶)的工具,旨在将 虚拟环境管理(Virtualenv) 和 依赖管理(Pip) 两者“焊接”在一起,提供统一的工作流。它引入了其他语言(如Javascript的npm,Ruby的bundler)中常见的“锁文件”概念。
- 核心功能:
- 自动创建和管理虚拟环境(基于Virtualenv)。
- 使用
Pipfile和Pipfile.lock来管理依赖。Pipfile:替代requirements.txt,用更结构化的TOML格式声明项目依赖(分为默认[packages]和开发[dev-packages]依赖)。Pipfile.lock:精确锁定所有依赖及其子依赖的具体版本,确保环境的一致性(可重现)。
- 如何使用:
- 安装依赖(同时会自动创建虚拟环境):
pipenv install requests - 安装开发依赖:
pipenv install --dev pytest - 激活环境:
pipenv shell - 运行命令:
pipenv run python my_script.py - 生成锁文件:
pipenv lock
- 安装依赖(同时会自动创建虚拟环境):
优点:
- 统一了工作流,不用再分开操作
virtualenv和pip。 Pipfile比requirements.txt更现代、更清晰。- 锁文件保证依赖确定性。
缺点:
- 早期版本性能较慢(锁依赖过程),后来有很大改善。
- 社区热度有被Poetry超越的趋势。
定位:旨在成为Python项目依赖管理的“一站式”解决方案。
3. Poetry
是什么?
Poetry 是一个更现代、功能更全面的 依赖管理和打包工具。它和Pipenv的目标高度重叠,但设计理念和实现更受开发者欢迎,尤其是在创建**库(Library)**项目时。
- 核心功能:
- 依赖管理:和Pipenv一样,使用
pyproject.toml文件(PEP 518标准)和poetry.lock文件。 - 打包和发布:这是Poetry的杀手级功能。它可以非常方便地帮你构建、打包和发布你的库到PyPI。你不需要再手动编写
setup.py、setup.cfg等文件,所有配置都在pyproject.toml中完成。
- 依赖管理:和Pipenv一样,使用
- 如何使用:
- 创建新项目:
poetry new my-project - 在已有项目初始化:
poetry init - 安装依赖:
poetry add requests(会自动创建虚拟环境和锁文件) - 安装开发依赖:
poetry add --dev pytest - 激活环境:
poetry shell - 运行命令:
poetry run python my_script.py - 构建和发布:
poetry build&&poetry publish
- 创建新项目:
优点:
- 依赖解析算法非常强大和快速,解决了Pipenv早期的一些性能问题。
- 完美整合了依赖管理和打包发布,对库开发者极其友好。
pyproject.toml是Python社区正在推行的新标准。
缺点:
- 学习一套新的命令(虽然很直观)。
- 对已有项目的迁移可能需要一些调整。
定位:现代Python项目(尤其是开源库)依赖管理和打包的全能型选手,是Pipenv的强大竞争者。
4. Conda
是什么?
Conda 是一个跨平台的包管理和环境管理系统,远超Python的范畴。它由Anaconda公司开发,最初是为了方便管理数据科学领域的复杂依赖(这些依赖很多是用C/C++编写的,而不仅仅是Python)。
- 核心功能:
- 环境管理:类似Virtualenv,
conda create -n myenv python=3.8 - 包管理:
conda install numpy。它的强大之处在于可以管理任何语言的包,而不仅仅是Python包。例如,它可以直接安装Python解释器、C库、CUDA工具包、R语言等。
- 环境管理:类似Virtualenv,
- 与Pip的区别:
pip从Python Package Index (PyPI) 安装纯Python的“轮子”(wheel)或源代码。conda从自己的渠道(如Anaconda.org)安装预编译好的二进制包。这对于科学计算库(如Numpy, Pandas, Scikit-learn)特别友好,因为它们通常依赖底层C/Fortran库,用conda安装可以避免复杂的编译过程。
优点:
- 真正意义上的跨语言包管理。
- 安装科学计算库极其方便,解决了令人头疼的编译和依赖问题。
- 环境管理功能强大。
缺点:
- 通道(channel)中的包版本可能比PyPI滞后。
- 生态相对封闭,不完全兼容PyPI(虽然也可以用
pip install在conda环境里装包,但不推荐混用,容易破坏环境)。
定位:数据科学、机器学习领域的首选工具,尤其适合需要管理复杂非Python依赖(如CUDA、MKL)的用户。
总结与对比
| 特性 | Virtualenv | Pipenv | Poetry | Conda |
|---|---|---|---|---|
| 核心功能 | 环境隔离 | 环境 + 依赖管理 | 依赖管理 + 打包 + 环境 | 跨语言包 + 环境管理 |
| 依赖文件 | requirements.txt | Pipfile, Pipfile.lock | pyproject.toml, poetry.lock | environment.yml |
| 包来源 | PyPI | PyPI | PyPI | Anaconda repo, PyPI (次要) |
| 打包发布 | 不支持 | 不支持 | 原生支持 | 不支持 |
| 适用领域 | 通用Python开发 | 应用开发 | 库和应用开发 | 数据科学、科学计算 |
| 关键优势 | 简单、轻量、标准 | 官方背书、统一工作流 | 现代、强大、打包一体化 | 解决非Python依赖、预编译包 |
如何选择?
-
做数据科学、机器学习:
- 首选 Conda。它能帮你轻松搞定NumPy、Pandas、TensorFlow、PyTorch等库及其复杂的底层依赖。
-
开发应用程序(Web、爬虫、脚本等):
- Pipenv 或 Poetry 都是优秀的选择。
- 如果你更看重打包和发布(比如在开发一个要给别人用的库),或者喜欢更现代的设计,Poetry 是更好的选择。
- 如果你习惯官方推荐的工具和思路,Pipenv也不错。
-
只需要一个简单的环境隔离:
- 使用Python自带的
venv模块或者 Virtualenv 就足够了,配合requirements.txt非常灵活。
- 使用Python自带的
-
混合使用:
- 一种常见的模式是:用Conda安装Python解释器和复杂的科学计算库(如TensorFlow),然后在Conda环境内部,用Poetry或Pipenv来管理纯Python的依赖。但这需要一些技巧来避免冲突。
Python环境管理工具对比
1069

被折叠的 条评论
为什么被折叠?



