第 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 (虚拟环境) 的自动化管家。它通过 Pipfile 和 Pipfile.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:基础虚拟环境
- 使用Python内置的
venv模块创建一个名为.venv的虚拟环境。 - 激活它,并使用
pip安装requests库。 - 在该环境中运行一个简单的脚本,使用
requests获取一个网页的状态码。 预期输出: 一个能返回HTTP状态码(如200)的脚本。
练习2:Pipenv实战
- 使用
pipenv初始化一个新项目,并安装beautifulsoup4库。 - 编写脚本,使用该库解析一个本地HTML字符串(例如
<html><body><p>Test</p></body></html>),并提取出<p>标签内的文本。 - 查看
Pipfile和Pipfile.lock的内容,理解其作用。 预期输出: "Test"
练习3:Poetry进阶
- 使用
poetry new创建一个名为my_math_utils的项目。 - 在
pyproject.toml中声明你的项目信息(名称、作者等)。 - 添加
numpy作为依赖。 - 在
my_math_utils/包中创建一个__init__.py文件,并在里面写一个函数,使用numpy计算一个列表的平均值。 - 使用
poetry run python交互式环境测试这个函数。 预期输出: 能成功计算并返回平均值。
5. 常见错误
- 忘记激活环境: 在全局Python环境中运行
pip install,导致污染全局环境或项目依赖混乱。始终确认你的命令提示符前面是否有(env_name)标识。 - 不提交锁文件: 只提交
Pipfile或pyproject.toml,而不提交Pipfile.lock或poetry.lock。锁文件确保了构建的可重复性,是协作和部署的关键。 - 混用工具: 在同一个项目中既使用
pipenv又使用poetry,或者手动用pip安装包,会导致依赖管理混乱。选定一个工具并坚持使用。 - 在全局环境安装开发工具: 像
pylint,black,isort这样的工具,也应该安装在项目虚拟环境中,或者使用pipx这类工具进行全局隔离安装,避免版本冲突。
6. 小结
本课我们学习了Python工程化中至关重要的环节:依赖与环境管理。
- 虚拟环境 是项目隔离的基石,必须为每个项目创建。
- Pipenv 通过
Pipfile和Pipfile.lock提供了自动化的依赖和环境管理,是requirements.txt的现代替代品,上手相对简单。 - Poetry 是一个更强大的全栈工具,以
pyproject.toml为核心,覆盖了依赖管理、打包和发布,更符合Python项目的未来发展趋势。 - 选择建议:对于小型脚本或快速原型,
venv + pip或pipenv都不错。对于正经的、需要长期维护和发布的库或应用项目,Poetry是目前更受推崇的选择,因为它与Python社区标准pyproject.toml的集成更紧密,功能也更全面。
记住:没有锁文件,就没有可靠的构建。 始终将你的环境定义文件(Pipfile/pyproject.toml)和锁文件(*.lock)纳入版本控制。