python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python环境管理工具

Python中四大环境管理工具全景对比:Virtualenv,Pipenv,Poetry与Conda

作者:雨夜的星光

Virtualenv/venv, Pipenv, Poetry, Conda,这四个都是工具箱 (环境与包管理器),它们的核心工作是一样的,下面小编就为大家简单介绍一下吧

Virtualenv/venv, Pipenv, Poetry, Conda: 这四个都是工具箱 (环境与包管理器)。它们的核心工作是一样的:创建一个独立的、隔离的 Python 环境,确保项目 A 的依赖不会和项目 B 的依赖打架。

一、逐一解析

1. Virtualenv (或 venv)

最经典、最基础的 Python 虚拟环境工具。venvvirtualenv 的一个子集,自 Python 3.3 起已内置到标准库中。

工作方式:它只做一个核心工作——创建一个独立的 Python 环境。在这个环境里,可以使用 pip 来安装包。依赖关系通常需要手动导出到 requirements.txt 文件中 (pip freeze > requirements.txt)。

依赖文件requirements.txt (约定俗成)。

优点

缺点

适用场景:简单的脚本、入门学习、或需要保持最少工具集的传统项目。如果你是初学者,从这个开始是最好的选择。

2. Pipenv

Pipenv 曾被誉为“Python 官方推荐的包管理工具”。它的目标是pipvenvrequirements.txt 整合成一个工具

工作方式:自动创建和管理虚拟环境。使用 pipenv install <package> 来安装包时,会自动更新 Pipfile 和 Pipfile.lock 两个文件。

依赖文件

优点

缺点

适用场景:通用的 Python 应用,特别是 Web 开发。希望简化 venv + pip + requirements.txt 流程的开发者。

3. Poetry

Poetry 是一个更现代化的 Python 依赖管理和打包工具,被认为是 Pipenv 的有力竞争者和继任者。

工作方式:与 Pipenv 类似,它也管理整个工作流。但它使用 pyproject.toml 这个更现代化的标准配置文件。它拥有一个非常强大的依赖解析引擎,能高效地解决版本冲突。

依赖文件

优点

缺点

学习曲线:对于新手来说,概念比 venv 要多。

适用场景:现代化的 Python 项目,特别是你需要将项目打包成库发布给他人使用时。很多新项目和团队都倾向于选择 Poetry。

4. Conda

Conda 是一个开源的、跨平台的、语言无关的包管理器和环境管理器。它不仅仅为 Python 服务。

工作方式Conda 可以创建包含特定版本 Python 和其他软件包的环境。它的包源来自 Anaconda 或 conda-forge 等渠道,而不仅仅是 PyPI。

依赖文件environment.yml

优点

缺点

适用场景数据科学、机器学习、科学计算。如果需要用到 NumPy, Pandas, Scikit-learn, TensorFlow, PyTorch 等库,Conda 通常是最佳选择。

特性Virtualenv (+ pip)PipenvPoetryConda
核心功能仅环境隔离环境 + 包管理环境 + 包管理 + 打包跨语言环境和包管理
依赖文件requirements.txtPipfile, Pipfile.lockpyproject.toml, poetry.lockenvironment.yml
主要优势简单、官方内置简化工作流、确定性构建强大的依赖解析、一体化管理非 Python 包、科学计算
推荐用户初学者、简单脚本Web 应用开发者现代项目、库开发者数据科学家、研究人员

二、案例对比

通过一个具体的案例,来更详细地讲解这四种工具的工作流程、核心思想和差异。假设要开发一个名为 quote_app 的小应用。它的功能是:

核心依赖 (生产依赖):

开发依赖:

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

详细讲解与分析:

优点: 流程清晰、简单直接,没有任何魔法。

缺点:

2. 使用 Pipenv (智能管家流派)

这种方法像是有个“智能管家,你告诉他需要什么,他自动帮你买来并分类放好”。

核心思想:将环境创建、包安装、依赖关系声明和环境锁定集于一身,开发者只需面对 pipenv 这一个工具。

操作流程:

安装依赖 (无需手动创建和激活环境):  Bash   pipenv 会自动检测当前目录有无虚拟环境,没有则会自动创建。

# 安装生产依赖
pipenv install flask requests

# 安装开发依赖,使用 --dev 标记
pipenv install pytest --dev

查看生成的文件: 执行完后,项目目录会自动生成两个文件:PipfilePipfile.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

详细讲解与分析:

优点:

缺点: 依赖解析速度有时较慢。

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

详细讲解与分析:

优点:

缺点: 对于只想做简单环境隔离的用户来说,功能稍显“重”。

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 是唯一能轻松解决这个问题的工具。

缺点:

最终结论

通过这个案例,可以清晰地看到:

三、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 能够识别项目中的 PipfilePipfile.lock 文件。

创建项目时:可以直接选择 "Pipenv",PyCharm 就会调用 pipenv 来创建环境,并自动安装 Pipfile 中声明的依赖。

打开项目时:如果 PyCharm 在一个项目中检测到了 Pipfile,它会弹窗提示:“我发现了一个 Pipfile,你要用 pipenv 来为这个项目创建环境吗?”

这让可以在 PyCharm 中享受到 pipenv 带来的所有好处(如依赖分类、版本锁定),同时免去了记忆和输入 pipenv run ... 等命令的麻烦。

3. PyCharm 与 Poetry 的关系

关系:直接/内置支持 (Built-in Support)

详解:这和 Pipenv 的关系非常类似。现代版本的 PyCharm 对 Poetry 提供了出色的支持。

4. PyCharm 与 Conda 的关系

关系:深度/专门支持 (Deep & Specific Support)

详解:PyCharm 对 Conda 的支持非常深入,因为它知道数据科学是 Python 的一个重要领域。

工具 (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环境管理工具内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文