83·模块十六:工程化与部署进阶

虚拟环境与依赖管理(Pipenv, Poetry)

virtual-environmentspipenvpoetrydependency-management

第 83 课 - 虚拟环境与依赖管理(Pipenv, Poetry)

所属模块:模块十六:工程化与部署 难度:intermediate 标签:virtual-environments, pipenv, poetry, dependency-management 上一课:项目打包与分发:setuptools 入门 下一课:版本控制:Git 基础与 Python 项目

1. 学习目标

完成本课学习后,你将能够:

  • 理解 为什么需要虚拟环境以及它在项目开发中的重要性。
  • 使用 Pipenv 创建虚拟环境、安装和管理项目依赖。
  • 使用 Poetry 创建项目、管理依赖和进行更高级的项目构建。
  • 对比 Pipenv 与 Poetry 的特点,并根据项目需求做出选择。

2. 核心概念

想象一下,你在同时开发两个项目:项目A需要requests库的2.20.0版本,而项目B需要更新的2.28.0版本。如果所有项目都共享系统全局的Python环境,安装一个版本会覆盖另一个,导致项目无法运行。这就是"依赖地狱"。

虚拟环境 就是为解决这个问题而生的。它是一个独立的、隔离的Python目录,里面包含特定版本的Python解释器以及该项目需要的所有第三方库。每个项目都可以有自己的"房间"(虚拟环境),互不干扰。

手动管理虚拟环境和依赖(venv + requirements.txt)虽然可行,但过程繁琐。现代工具将环境创建和依赖管理合二为一,带来了更流畅的开发体验。

Pipenv 可以看作是 pip (包安装器) 和 venv (虚拟环境) 的自动化管家。它通过 PipfilePipfile.lock 来声明和精确锁定依赖。

Poetry 是一个更全面的依赖管理和打包工具。它从项目初始化开始介入,管理 pyproject.toml 这个现代Python项目的标准配置文件,并自动生成锁文件,还能一键构建和发布你的项目。

我们可以把它们比作:Pipenv 是专注于依赖和环境的"管家",而 Poetry 是负责从"建房"(项目初始化)到"交付"(打包发布)的"全能管家"。

3. 代码示例

让我们通过一个简单的Flask应用,来演示如何使用这两种工具。

示例1:使用 Pipenv

# 1. 确保已安装Pipenv
pip install pipenv

# 2. 创建一个项目目录并进入
mkdir my_flask_app && cd my_flask_app

# 3. 使用Pipenv创建虚拟环境并安装Flask (会自动生成Pipfile)
pipenv install flask
# 控制台会显示虚拟环境的位置,例如:Creating a virtualenv for this project...

# 4. 激活虚拟环境(或使用 `pipenv run` 前缀直接运行命令)
pipenv shell

# 5. 创建一个简单的Flask应用文件 `app.py`
# app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello from Pipenv-managed environment!"

if __name__ == '__main__':
    app.run(debug=True)
# 6. 在激活的环境中运行应用
python app.py
# 或者不激活环境,直接运行:
# pipenv run python app.py

# 7. 查看依赖树
pipenv graph

# 8. 当在另一台机器上部署时,只需复制Pipfile和Pipfile.lock,然后运行:
pipenv install --deploy

示例2:使用 Poetry

# 1. 安装Poetry (官方推荐方式,或使用pip安装)
curl -sSL https://install.python-poetry.org | python3 -
# 或: pip install poetry

# 2. 创建一个新的项目(或使用poetry init在现有目录初始化)
poetry new my_poetry_app
cd my_poetry_app

# 3. 添加Flask作为依赖(会自动更新pyproject.toml)
poetry add flask

# 4. 在Poetry管理的虚拟环境中运行应用
# 先创建app.py
# my_poetry_app/app.py (Poetry创建的项目结构略有不同,此处放在包内)
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello from Poetry-managed environment!"

if __name__ == '__main__':
    app.run(debug=True)
# 5. 使用poetry run运行脚本
poetry run python my_poetry_app/app.py

# 6. 或者激活shell
poetry shell
python app.py

# 7. 查看依赖
poetry show --tree

# 8. 在另一台机器上,使用`pyproject.toml`和`poetry.lock`文件快速安装所有依赖:
poetry install

4. 实践练习

练习1:基础虚拟环境

  1. 使用Python内置的 venv 模块创建一个名为 .venv 的虚拟环境。
  2. 激活它,并使用 pip 安装 requests 库。
  3. 在该环境中运行一个简单的脚本,使用 requests 获取一个网页的状态码。 预期输出: 一个能返回HTTP状态码(如200)的脚本。

练习2:Pipenv实战

  1. 使用 pipenv 初始化一个新项目,并安装 beautifulsoup4 库。
  2. 编写脚本,使用该库解析一个本地HTML字符串(例如 <html><body><p>Test</p></body></html>),并提取出 <p> 标签内的文本。
  3. 查看 PipfilePipfile.lock 的内容,理解其作用。 预期输出: "Test"

练习3:Poetry进阶

  1. 使用 poetry new 创建一个名为 my_math_utils 的项目。
  2. pyproject.toml 中声明你的项目信息(名称、作者等)。
  3. 添加 numpy 作为依赖。
  4. my_math_utils/ 包中创建一个 __init__.py 文件,并在里面写一个函数,使用numpy计算一个列表的平均值。
  5. 使用 poetry run python 交互式环境测试这个函数。 预期输出: 能成功计算并返回平均值。

5. 常见错误

  • 忘记激活环境: 在全局Python环境中运行 pip install,导致污染全局环境或项目依赖混乱。始终确认你的命令提示符前面是否有(env_name)标识。
  • 不提交锁文件: 只提交 Pipfilepyproject.toml,而不提交 Pipfile.lockpoetry.lock。锁文件确保了构建的可重复性,是协作和部署的关键。
  • 混用工具: 在同一个项目中既使用 pipenv 又使用 poetry,或者手动用 pip 安装包,会导致依赖管理混乱。选定一个工具并坚持使用。
  • 在全局环境安装开发工具:pylint, black, isort 这样的工具,也应该安装在项目虚拟环境中,或者使用 pipx 这类工具进行全局隔离安装,避免版本冲突。

6. 小结

本课我们学习了Python工程化中至关重要的环节:依赖与环境管理

  • 虚拟环境 是项目隔离的基石,必须为每个项目创建。
  • Pipenv 通过 PipfilePipfile.lock 提供了自动化的依赖和环境管理,是 requirements.txt 的现代替代品,上手相对简单。
  • Poetry 是一个更强大的全栈工具,以 pyproject.toml 为核心,覆盖了依赖管理、打包和发布,更符合Python项目的未来发展趋势。
  • 选择建议:对于小型脚本或快速原型,venv + pippipenv 都不错。对于正经的、需要长期维护和发布的库或应用项目,Poetry是目前更受推崇的选择,因为它与Python社区标准 pyproject.toml 的集成更紧密,功能也更全面。

记住:没有锁文件,就没有可靠的构建。 始终将你的环境定义文件(Pipfile/pyproject.toml)和锁文件(*.lock)纳入版本控制。

练习编辑器

python
Loading...

继续学习

完成本课后,建议继续学习下一课「版本控制:Git 基础与 Python 项目」 以巩固所学知识。