virtualenv/venv, pipenv, poetry, conda: 这四个都是工具箱 (环境与包管理器)。它们的核心工作是一样的:创建一个独立的、隔离的 python 环境,确保项目 a 的依赖不会和项目 b 的依赖打架。

一、逐一解析
1. virtualenv (或 venv)
最经典、最基础的 python 虚拟环境工具。venv 是 virtualenv 的一个子集,自 python 3.3 起已内置到标准库中。
工作方式:它只做一个核心工作——创建一个独立的 python 环境。在这个环境里,可以使用 pip 来安装包。依赖关系通常需要手动导出到 requirements.txt 文件中 (pip freeze > requirements.txt)。
依赖文件:requirements.txt (约定俗成)。
优点:
- 官方内置:
venv是 python 官方标准,无需额外安装。 - 简单轻量:功能专一,只负责环境隔离,易于理解。
- 兼容性好:被所有工具和平台广泛支持。
缺点:
- 功能单一:它不负责管理依赖版本冲突,
pip安装依赖时默认会用最新版,可能导致“依赖地狱”。 - 手动操作:需要手动使用
pip freeze来更新requirements.txt。
适用场景:简单的脚本、入门学习、或需要保持最少工具集的传统项目。如果你是初学者,从这个开始是最好的选择。
2. pipenv
pipenv 曾被誉为“python 官方推荐的包管理工具”。它的目标是将 pip、venv 和 requirements.txt 整合成一个工具。
工作方式:自动创建和管理虚拟环境。使用 pipenv install <package> 来安装包时,会自动更新 pipfile 和 pipfile.lock 两个文件。
依赖文件:
pipfile:用来记录项目直接依赖的包(类似 requirements.txt)。pipfile.lock:记录了所有包(包括依赖的依赖)的精确版本号和哈希值,确保团队成员安装的环境完全一致。
优点:
- 集成度高:将环境管理和包管理合二为一,简化了工作流。
- 确定性构建:
pipfile.lock保证了每次安装的环境都完全相同,利于团队协作。 - 自动管理:无需手动激活虚拟环境,使用
pipenv run即可在虚拟环境中执行命令。
缺点:
- 性能问题:在处理复杂的依赖关系时,有时会比较慢。
- 发展放缓:近年来社区活跃度有所下降。
适用场景:通用的 python 应用,特别是 web 开发。希望简化 venv + pip + requirements.txt 流程的开发者。
3. poetry
poetry 是一个更现代化的 python 依赖管理和打包工具,被认为是 pipenv 的有力竞争者和继任者。
工作方式:与 pipenv 类似,它也管理整个工作流。但它使用 pyproject.toml 这个更现代化的标准配置文件。它拥有一个非常强大的依赖解析引擎,能高效地解决版本冲突。
依赖文件:
pyproject.toml:一个标准的配置文件,用于定义项目元数据、依赖、脚本等。poetry.lock:功能与pipfile.lock类似,锁定所有依赖的精确版本。
优点:
- 强大的依赖解析:在解决复杂的包版本冲突方面表现非常出色。
- 功能全面:不仅是依赖管理工具,还是一个项目构建和打包工具,可以轻松地将你的项目发布到 pypi。
- 社区活跃:目前非常流行,更新迭代快。
缺点:
学习曲线:对于新手来说,概念比 venv 要多。
适用场景:现代化的 python 项目,特别是你需要将项目打包成库发布给他人使用时。很多新项目和团队都倾向于选择 poetry。
4. conda
conda 是一个开源的、跨平台的、语言无关的包管理器和环境管理器。它不仅仅为 python 服务。
工作方式:conda 可以创建包含特定版本 python 和其他软件包的环境。它的包源来自 anaconda 或 conda-forge 等渠道,而不仅仅是 pypi。
依赖文件:environment.yml。
优点:
- 超越 python:能够安装和管理非 python 的依赖包(如 c/c++ 库、cuda、r 语言等),这对于科学计算至关重要。
- 强大的二进制包管理:轻松处理复杂的二进制依赖,避免了在 windows 等系统上编译 c 扩展的麻烦。
缺点:
- 不够通用:主要集中在数据科学领域,web 开发等领域使用较少。
- 环境隔离:与
pip混用时可能产生冲突和问题,需要小心管理。
适用场景:数据科学、机器学习、科学计算。如果需要用到 numpy, pandas, scikit-learn, tensorflow, pytorch 等库,conda 通常是最佳选择。
| 特性 | virtualenv (+ pip) | pipenv | poetry | conda |
| 核心功能 | 仅环境隔离 | 环境 + 包管理 | 环境 + 包管理 + 打包 | 跨语言环境和包管理 |
| 依赖文件 | requirements.txt | pipfile, pipfile.lock | pyproject.toml, poetry.lock | environment.yml |
| 主要优势 | 简单、官方内置 | 简化工作流、确定性构建 | 强大的依赖解析、一体化 | 管理非 python 包、科学计算 |
| 推荐用户 | 初学者、简单脚本 | web 应用开发者 | 现代项目、库开发者 | 数据科学家、研究人员 |
二、案例对比
通过一个具体的案例,来更详细地讲解这四种工具的工作流程、核心思想和差异。假设要开发一个名为 quote_app 的小应用。它的功能是:
- 使用 flask 框架搭建一个简单的网页。
- 使用 requests 库从一个公开的 api 获取一条随机的名人名言并显示在网页上。
- 还将使用 pytest 库来编写测试,但
pytest只在开发时需要,最终部署上线时不需要。
核心依赖 (生产依赖):
flaskrequests
开发依赖:
pytest
现在,分别用四种工具来为这个 quote_app 项目搭建环境和管理依赖。
1. 使用 virtualenv + pip (传统基础流派)
这种方法像是在“先建好毛坯房(环境),再一件件手动搬入家具(包装)”。
核心思想:环境管理和包管理是两件独立的事。venv 只管创建环境,pip 只管安装包,requirements.txt 只是一个记录,需要开发者手动维护。
操作流程:
创建并激活环境: bash
# 在项目根目录创建名为 venv 的虚拟环境 python -m venv venv # 激活环境 # windows .\venv\scripts\activate # macos/linux source venv/bin/activate # 激活后,命令行前面会出现 (venv)
安装依赖包: bash
(venv) $ pip install flask requests (venv) $ pip install pytest
注意:此时 pip 无法区分哪些是生产依赖,哪些是开发依赖。它们都被平等地安装了。
生成依赖文件: bash 当准备将代码分享给他人时,需要生成依赖列表。
(venv) $ pip freeze > requirements.txt
查看 requirements.txt 文件内容: 打开 requirements.txt,会看到类似下面的内容(版本号可能不同):
blinker==1.7.0 certifi==2024.7.4 charset-normalizer==3.3.2 click==8.1.7 colorama==0.4.6 flask==3.0.3 idna==3.7 iniconfig==2.0.0 itsdangerous==2.1.2 jinja2==3.1.3 markupsafe==2.1.5 packaging==24.0 pluggy==1.5.0 pytest==8.2.0 requests==2.31.0 urllib3==2.2.1 werkzeug==3.0.2
同事如何使用: bash 他人拿到项目后,也需要创建并激活自己的 venv 环境,然后运行:
(venv) $ pip install -r requirements.txt
详细讲解与分析:
优点: 流程清晰、简单直接,没有任何魔法。
缺点:
- 依赖混杂:
requirements.txt文件非常混乱。它把flask、requests、pytest以及它们所有深层次的子依赖(如click,jinja2)全都混在一起。你无法一眼看出这个项目的直接依赖是什么。 - 无法区分环境: 无法分离生产依赖和开发依赖。这意味着即使在生产环境,
pytest也会被安装,造成不必要的臃肿。 - 版本不确定性:
requirements.txt锁定了所有包的版本,这很好。但如果手动在requirements.txt中只写flask和requests,那么pip install时可能会因为子依赖的版本更新而导致构建失败。
2. 使用 pipenv (智能管家流派)
这种方法像是有个“智能管家,你告诉他需要什么,他自动帮你买来并分类放好”。
核心思想:将环境创建、包安装、依赖关系声明和环境锁定集于一身,开发者只需面对 pipenv 这一个工具。
操作流程:
安装依赖 (无需手动创建和激活环境): bash pipenv 会自动检测当前目录有无虚拟环境,没有则会自动创建。
# 安装生产依赖 pipenv install flask requests # 安装开发依赖,使用 --dev 标记 pipenv install pytest --dev
查看生成的文件: 执行完后,项目目录会自动生成两个文件:pipfile 和 pipfile.lock。
pipfile ini, toml (清晰易读,给人看的)
[[source]] url = "https://pypi.org/simple" verify_ssl = true name = "pypi" [packages] flask = "*" requests = "*" [dev-packages] pytest = "*" [requires] python_version = "3.10"
pipfile.lock (内容很长,给机器看的,保证确定性): 里面是所有包(包括子依赖)的精确版本和哈希值,确保任何人在任何机器上安装的都是完全一致的环境。
在虚拟环境中运行命令: bash
# pipenv 会自动在它管理的虚拟环境中运行 flask 命令 pipenv run flask run
他人如何使用: bash 他人拿到项目后,只需运行一个命令,pipenv 会读取 pipfile.lock 并安装所有东西。
# 安装所有依赖(包括开发依赖) pipenv install # 如果是部署到服务器,可以只安装生产依赖 pipenv install --deploy
详细讲解与分析:
优点:
- 依赖清晰:
pipfile清晰地分离了[packages]和[dev-packages]。 - 确定性构建:
pipfile.lock保证了环境的可复现性。 - 流程简化: 无需再关心
venv的创建和激活,工具在后台都做好了。
缺点: 依赖解析速度有时较慢。
3. 使用 poetry (建筑师 + 项目经理流派)
这种方法像是“一位建筑师,帮你规划好整个项目(元数据),管理好所有建材(依赖),并能直接将房子打包成产品(发布)”。
核心思想:一个工具管理项目的整个生命周期,从创建、依赖管理到最终的构建和发布。
操作流程:
初始化项目: bash poetry 推荐通过 init 命令来初始化项目配置。
poetry init # 会有交互式提问,帮你生成 pyproject.toml
添加依赖: bash
# 添加生产依赖 poetry add flask requests # 添加开发依赖 (使用 --group) poetry add pytest --group dev
查看生成的文件:
pyproject.toml (项目的中央配置文件): ini, toml
[tool.poetry] name = "quote-app" version = "0.1.0" description = "" authors = ["your name <you@example.com>"] [tool.poetry.dependencies] python = "^3.10" flask = "^3.0.3" requests = "^2.31.0" [tool.poetry.group.dev.dependencies] pytest = "^8.2.0" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api"
poetry.lock:与 pipfile.lock 作用相同,锁定版本。
在虚拟环境中运行命令: bash
poetry run flask run
他人如何使用: bash
# 安装所有依赖 poetry install # 部署时只安装生产依赖 poetry install --no-dev
详细讲解与分析:
优点:
- 配置标准化:
pyproject.toml是 pep 518 采纳的官方标准,未来会越来越通用。 - 依赖解析强大: 它的依赖解析算法通常比
pipenv更快、更准确。 - 功能一体化: 从开发到打包发布,一个工具搞定。
缺点: 对于只想做简单环境隔离的用户来说,功能稍显“重”。
4. 使用 conda (城市规划师流派)
这种方法像是“一位城市规划师,他不仅能帮你盖房子(python环境),还能帮你修好通往房子的路、接好水电煤气(非python依赖)”。
核心思想:管理和隔离任何语言的软件包,尤其擅长处理数据科学生态中复杂的二进制依赖。
操作流程: 注意:用 conda 来管理一个纯 python 的 web 应用不是典型用法,但完全可行,这里仅为演示。
创建并激活环境: bash
# 创建一个名为 quote_app 并指定 python 版本为 3.10 的环境 conda create --name quote_app python=3.10 # 激活环境 conda activate quote_app
安装依赖: bash
(quote_app) $ conda install flask requests pytest
conda 也有“开发依赖”的概念,但管理起来不如 poetry/pipenv 直观,通常通过多个 environment.yml 文件来管理。
生成依赖文件: bash
(quote_app) $ conda env export > environment.yml
查看 environment.yml 文件: yaml
name: quote_app channels: - defaults dependencies: - flask=3.0.0 - requests=2.31.0 - pytest=7.4.0 # ... 这里会包含所有依赖,包括 python 自身和c库 - python=3.10.13 - openssl=3.0.13 # ... 等等 prefix: c:\users\youruser\miniconda3\envs\quote_app
他人如何使用: bash
conda env create -f environment.yml
详细讲解与分析:
优点:
超越 python: 当你的项目依赖(例如)一个特定的 c++ 编译器或 cuda 版本时,conda 是唯一能轻松解决这个问题的工具。
缺点:
- 杀鸡用牛刀: 对于我们这个纯 python 的 web 应用案例,conda 显得过于笨重。
- 包源不同: conda 主要从 anaconda 的渠道下载预编译好的包,这些包的更新可能滞后于 pypi。
最终结论
通过这个案例,可以清晰地看到:
- virtualenv/venv 是基础,手动挡,能完成任务但过程繁琐,容易出错。
- pipenv 是自动挡,简化了流程,通过
pipfile解决了依赖分类问题。 - poetry 是更先进的自动挡,不仅流程顺滑,还有强大的依赖解析和项目打包功能,是现代 python 开发的趋势。
- conda 是特种车辆(比如工程车),专门用来解决数据科学领域那些棘手的、跨语言的依赖问题,用在普通道路(纯python应用)上则显得笨重。
三、pycharm 与每一个“工具箱”的关系
核心关系:集成与被集成
pycharm 的核心定位是一个“集成者”。它不会自己去发明一个新的环境管理方案,而是去接入和支持社区中最流行、最强大的工具。
pycharm 通过提供图形化界面,让你不再需要手动去敲这些工具的命令行,从而极大地简化了操作。
1. pycharm 与 virtualenv/venv 的关系
关系:原生/基础支持 (native support)
详解:这是 pycharm 最基础、最核心的集成。当你下载安装好 python 后,venv 就已经内置了。pycharm 将其作为创建新项目的默认选项。当你在 pycharm 里选择用 "virtualenv" 创建一个新环境时,pycharm 其实就是在后台帮你运行了 python -m venv venv 这个命令,并自动将生成的新环境设置为项目的解释器。你无需手动敲命令,也无需手动激活,pycharm 的终端会自动帮你搞定。
2. pycharm 与 pipenv 的关系
关系:直接/内置支持 (built-in support)
详解:pycharm 能够识别项目中的 pipfile 和 pipfile.lock 文件。
创建项目时:可以直接选择 "pipenv",pycharm 就会调用 pipenv 来创建环境,并自动安装 pipfile 中声明的依赖。
打开项目时:如果 pycharm 在一个项目中检测到了 pipfile,它会弹窗提示:“我发现了一个 pipfile,你要用 pipenv 来为这个项目创建环境吗?”
这让可以在 pycharm 中享受到 pipenv 带来的所有好处(如依赖分类、版本锁定),同时免去了记忆和输入 pipenv run ... 等命令的麻烦。
3. pycharm 与 poetry 的关系
关系:直接/内置支持 (built-in support)
详解:这和 pipenv 的关系非常类似。现代版本的 pycharm 对 poetry 提供了出色的支持。
- pycharm 能够识别项目核心的
pyproject.toml文件。 - 创建项目时:可以选择 "poetry" 作为环境管理器。
- 打开项目时:pycharm 同样能检测到
pyproject.toml并建议使用poetry来安装依赖。 - pycharm 的 python 包管理界面也能很好地与
poetry互动,通过界面添加或删除的包,都会被poetry正确地更新到pyproject.toml文件中。
4. pycharm 与 conda 的关系
关系:深度/专门支持 (deep & specific support)
详解:pycharm 对 conda 的支持非常深入,因为它知道数据科学是 python 的一个重要领域。
- pycharm 能自动检测电脑上安装的
conda(无论是 anaconda 还是 miniconda)。 - 在解释器设置中,pycharm 可以列出所有已存在的 conda 环境,让你轻松切换。
- 也可以在 pycharm 的界面中,直接创建新的 conda 环境,或者从
environment.yml文件来创建环境。 - 这对于数据科学家来说是巨大的便利,他们可以在熟悉的 ide 中无缝地使用强大的 conda 环境。
| 工具 (tool) | 与 pycharm 的关系 (relationship with pycharm) | 核心要点 |
| virtualenv/venv | 原生/基础支持 | pycharm 的默认选项,最紧密的集成,开箱即用。 |
| pipenv | 直接/内置支持 | pycharm 识别 pipfile 并能自动调用 pipenv 命令。 |
| poetry | 直接/内置支持 | pycharm 识别 pyproject.toml 并能自动调用 poetry 命令。 |
| conda | 深度/专门支持 | pycharm 有专门针对 conda 的界面和功能,方便数据科学工作流。 |
到此这篇关于python中四大环境管理工具全景对比:virtualenv,pipenv,poetry与conda的文章就介绍到这了,更多相关python环境管理工具内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论