用 venv 隔离项目依赖:创建、激活、导出 requirements

准备工作

  • 已安装 Python 3;终端执行 python3 --version 有输出。

  • 依据:Python 官方文档 venv —— Creation of virtual environments。[1]

  • 核实日期:2026-10-24。

操作步骤

1、在项目目录创建虚拟环境

做什么:进入项目根目录后执行:

python3 -m venv .venv

为什么:venv 会在目录内创建一套独立的解释器与 site-packages,避免把项目依赖装进系统 Python,也减少多项目之间的版本互相踩踏。[1]

怎么确认:出现 .venv/;macOS/Linux 下存在 .venv/bin/python,Windows 下存在 .venv\Scripts\python.exe;对该解释器执行 .venv/bin/python -c "import sys; print(sys.prefix)" 应指向 .venv。

2、激活后再升级 pip 并安装依赖

做什么:

source .venv/bin/activate   # macOS/Linux
# Windows CMD: .venv\Scripts\activate.bat
# Windows PowerShell: .venv\Scripts\Activate.ps1
python -m pip install -U pip
pip install requests

为什么:激活会把虚拟环境的 bin/Scripts 放到 PATH 前面,此后 python 与 pip 默认指向环境内工具。未激活时很容易把包装到用户目录或系统目录,造成“我装了但运行时找不到”。[1]

怎么确认:which python(Windows 用 where python)指向 .venv;python -m pip show requests 能显示包信息且 Location 落在 .venv 下。

3、导出依赖并在新环境复现

做什么:

pip freeze > requirements.txt
# 另一台机器或干净目录:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

为什么:freeze 记录当前环境已安装发行版及版本,便于协作与 CI 复现。官方把 venv 定位为轻量隔离,不替代完整打包工具,但对多数应用项目足够。[1]

怎么确认:新环境 pip list 主要版本与原环境一致;python -c "import requests; print(requests.__version__)" 无报错。

4、退出与删除(可选)

做什么:deactivate 退出激活;确认无进程占用后可删除整个 .venv/ 目录重建。

为什么:虚拟环境是目录级隔离,删掉即移除;比清理系统 site-packages 安全得多。[1]

怎么确认:deactivate 后 which python 不再指向 .venv;删除目录后原路径不存在。

虚拟环境解决的是“同一台机器上多个项目抢同一套全局 site-packages”的老问题。官方文档把它定位成标准库自带的轻量方案:不替代完整的打包发布流程,但足够让日常开发把依赖边界画清楚。

激活只是改当前 shell 的 PATH;关掉终端或执行 deactivate 后,系统又回到原来的解释器。所以写自动化脚本时,更稳妥的做法是直接调用 .venv/bin/python -m pip,不依赖“人是否点过激活”。

若你在 CI 里使用 venv,通常的顺序是:创建 → 升级 pip → 安装 requirements → 跑测试。把这四步写进同一 job,比在宿主机全局装包更容易复现失败现场。

注意事项

  • 不要把 .venv/ 提交进 Git;提交 requirements.txt(或你们选定的锁文件)即可。

  • 某些 Linux 发行版限制系统 pip,优先始终在 venv 内用 python -m pip。

  • 需要更严哈希锁定时,再考虑 pip-tools / uv / poetry 等;本教程只覆盖标准库 venv。

来源

[1] Python Docs · venv — Creation of virtual environments · https://docs.python.org/3/library/venv.html · 核实于 2026-10-24

#Python #venv #虚拟环境 #pip #教程

排序方式 :

成为第一条评论!

Nobody's responded to this post yet. Add your thoughts and get the conversation going.