Kodokon kodokon.com

虚拟环境、pip 与一个干净的项目

把每个项目隔离在各自的 venv 中,锁定依赖版本,并采用一套可复现的项目结构。

8 分钟 · 3 题

在 Kodokon 中打开本课

把你所有项目的依赖都装进同一个解释器,最终必然撞上版本冲突:项目 A 需要 requests 2.31,项目 B 却需要一个不兼容的版本。虚拟环境venv)把每个项目隔离开来:它有自己的解释器、自己的 pip、自己的包。这是没有商量余地的专业实践 - 一个项目,一个环境,并且能在任何机器上被原样重建。

BASH
python -m venv .venv
source .venv/bin/activate
# On Windows:
# .venv\Scripts\activate
python -m pip install requests
python -m pip list
创建、激活并填充一个虚拟环境

要让安装过程可复现,就得锁定版本。pip freeze 会导出整个环境,包括传递依赖在内,并带上精确的版本号:可复现性拉满,但升级起来很费劲。现代的做法把两种需求分开:直接依赖以宽松的约束声明在 pyproject.toml 中,再生成一个锁文件用于精确安装。在小项目的规模上,requirements.txt 依然完全拿得出手。

BASH
python -m pip freeze > requirements.txt
# On another machine:
python -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
先冻结,再原样重建环境

在结构方面,src 布局是标准参考:代码放在 src/<package>/,测试放在 tests/,配置放在 pyproject.tomlsrc 目录的意义并不只是好看:它能防止你不小心从当前目录导入本地的包,那样会掩盖打包方面的错误 - 有了它,你的测试跑的是真正安装好的那个包。开发过程中,pip install -e . 会以可编辑模式安装项目。

BASH
mkdir -p src/billing tests
touch src/billing/__init__.py
touch src/billing/invoices.py
touch tests/test_invoices.py
touch pyproject.toml README.md .gitignore
echo ".venv/" >> .gitignore
一个采用 src 布局的项目骨架

知识检测

确认你已牢记本课的重点内容。

  1. 虚拟环境保证了什么?
    • Python 代码执行得更快
    • 每个项目的依赖彼此隔离
    • 不同 Python 版本之间的兼容性
    • 对已安装的包进行加密
  2. 由 pip freeze 生成的 requirements.txt 里包含什么?
    • 只有你的直接依赖
    • 所有已安装的依赖,连精确版本号一起
    • PyPI 上可用的包的列表
  3. 为什么应该优先使用 python -m pip install 而不是 pip install?
    • 因为这是 venv 内部唯一接受的写法
    • 因为这条命令针对的是当前激活解释器的 pip
    • 因为安装速度更快