Python内置venv创建虚拟环境完整教程:从激活到删除
全面讲解Python内置venv模块的使用方法,从环境准备、创建命令、多平台终端激活、依赖管理、退出环境到彻底安全删除,提供详细代码、原理拆解与SVG架构图。
venv 模块,能够在单个项目目录内创建轻量、完全独立的 Python 运行沙箱,无需安装第三方工具即可实现第三方包的强隔离。本文将按实际开发步骤,从环境准备、创建、跨平台激活、依赖维护一直讲到彻底删除。
一、认识 venv 及其隔离核心原理
从 Python 3.3 开始,官方标准库内置了 venv 模块,并在 Python 3.4 之后成为管理独立项目环境的官方推荐方案。与重量级的 Anaconda 或早期需要额外安装的 virtualenv 不同,venv 极为轻量,它不需要完整复制几十甚至上百兆的 Python 系统安装包。
当执行创建命令时,venv 主要完成三项核心工作:在目标路径下创建专用目录;生成配置文件 pyvenv.cfg 指向底层的系统解释器;生成专用终端调用脚本,将项目解释器路径优先置于操作系统的 PATH 环境变量之前。
二、环境准备与创建命令
在创建虚拟环境之前,需要确保已安装好 Python 并且可以在终端正常调用。通过查看 Python 版本来验证安装:
# 检查当前终端默认的 Python 版本
python3 --version
# 或在部分 Windows 系统下执行
python --version
python3 但未包含 venv 模块。若执行时提示 No module named venv,需要先通过 apt 包管理器补装:sudo apt install python3-venv。
创建虚拟环境的标准语法
创建虚拟环境的核心语法为 python -m venv <环境存放目录>。通常推荐直接在项目根目录下创建名为 .venv 或 venv 的文件夹:
# 进入你的工作项目目录
cd /path/to/your-project
# 创建名为 .venv 的虚拟环境
python3 -m venv .venv
命令执行后,终端不会有显式输出。执行完毕后,当前目录下会生成一个 .venv 文件夹。该目录包含独立的 pyvenv.cfg 配置文件,以及存放专属包的 lib 目录与控制脚本的 bin(Linux/macOS)或 Scripts(Windows)目录。
三、激活虚拟环境:多系统终端命令与原理
创建完目录后,虚拟环境默认并未处于使用状态。必须通过执行“激活脚本”来通知当前终端会话使用该环境中的解释器与工具链。
各操作系统与 Shell 的激活命令一览
根据你使用的操作系统和终端 Shell 类型,选择对应的激活命令:
| 操作系统 / 终端环境 | Shell 类型 | 激活命令 |
|---|---|---|
| macOS / Linux | bash / zsh | source .venv/bin/activate |
| macOS / Linux | fish | source .venv/bin/activate.fish |
| macOS / Linux | csh / tcsh | source .venv/bin/activate.csh |
| Windows | CMD (命令提示符) | .venv\Scripts\activate.bat |
| Windows | PowerShell | .venv\Scripts\Activate.ps1 |
| Windows | Git Bash | source .venv/Scripts/activate |
如何验证激活是否成功?
激活成功后,最直观的标志是终端命令行提示符最前面会出现用括号包裹的环境名称,例如 (.venv) user@host:~/project$。
为了在脚本或开发工具中进一步验证,可以执行以下命令检查当前调用的实际路径:
# macOS / Linux 下检查解释器绝对路径
which python
# 示例输出:/Users/name/my-project/.venv/bin/python
# Windows 下检查解释器路径
where python
# 示例输出:C:\Projects\my-project\.venv\Scripts\python.exe
只要输出的绝对路径指向项目下的 .venv 目录内部,说明激活已经完全生效,后续执行的所有 python 和 pip 操作都已被隔离在当前沙箱中。
四、日常使用与依赖隔离实操
激活虚拟环境后,便可放心安装项目所需的第三方依赖库,完全无需使用 sudo 权限,也不会污染操作系统全局的 Python 环境。
1. 安装、升级与查看第三方依赖
在激活状态下,直接使用 pip 安装所需软件包:
# 安装项目依赖(例如 requests 库)
pip install requests
# 查看当前虚拟环境中已安装的所有包
pip list
此时运行 pip list,你只会看到刚刚安装的 requests 及其直接依赖包,以及 pip 本身,干干净净,没有系统全局包的干扰。
2. 导出与重建依赖清单 (requirements.txt)
在团队协作或部署阶段,切忌将整个 .venv 文件夹直接压缩或提交到 Git 仓库。正确的工程化做法是导出版本依赖清单:
# 导出当前虚拟环境中的所有固定版本依赖
pip freeze > requirements.txt
# 查看生成的依赖文件内容示例
cat requirements.txt
# requests==2.31.0
# certifi==2023.11.17
# charset-normalizer==3.3.2
# idna==3.6
# urllib3==2.1.0
当其他同事拉取代码或在服务器部署时,只需全新创建 .venv,激活后一条命令即可批量恢复全部环境:
pip install -r requirements.txt
五、退出虚拟环境 (deactivate)
当当前项目的开发工作结束,或者需要切换到其他项目时,需要退出当前激活的环境。
退出非常简单,直接在终端中输入内置函数:
deactivate
执行后,命令行提示符前面的 (.venv) 标记会立即消失。在底层,deactivate 脚本会将当前终端的 PATH 环境变量还原为激活之前的备份值,终端会重新使用操作系统的默认全局解释器。
六、如何正确且彻底地删除虚拟环境
许多初学者会寻找诸如 python -m venv --delete 之类的命令,但实际上 Python 没有提供专门的删除子命令。
这是因为 venv 设计之初就遵循“纯净目录封装”原则——该环境内所有下载的轮子包、缓存文件、解释器链接与可执行脚本全部严格存放在你所指定的那个文件夹内,不会在操作系统注册表或系统级目录留下任何配置项。
安全删除步骤:
- 必须先退出环境:如果在当前终端处于激活状态,先执行
deactivate退出,避免终端保留残留的临时环境变量。 - 直接删除文件夹:使用操作系统常规命令或在资源管理器/访达中直接将
.venv文件夹整体移入废纸篓或彻底删除。
# macOS / Linux 下彻底删除虚拟环境
rm -rf .venv
# Windows PowerShell 下彻底删除
Remove-Item -Recurse -Force .venv
# Windows CMD 下彻底删除
rmdir /s /q .venv
pyvenv.cfg 和激活脚本内记录的是绝对物理路径。如果你把项目的 .venv 拷贝到另一台电脑或修改了上层父文件夹的名称,里面的内部路径将全部失效,导致 pip 报错或直接寻找不到解释器。正确的迁移方式始终是:通过 requirements.txt 在目标位置重新 venv 创建并安装。
七、常见问题排查与避坑指南
1. Windows PowerShell 报错“无法加载文件...因为在此系统上禁止运行脚本”
这是 Windows 系统的默认执行策略(Execution Policy)限制,防止未授权脚本运行。解决方法有两种:
- 临时解决(仅对当前终端有效):以管理员身份或普通用户打开 PowerShell,执行
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass,随后即可正常激活。 - 永久解决(当前用户权限):运行
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned,按Y确认即可。
2. 在 .gitignore 中忽略环境目录
在 Git 版本控制中,必须将虚拟环境目录加入忽略清单,避免将数以万计的第三方模块和二进制文件推送到远程仓库。在项目根目录的 .gitignore 中添加:
.venv/
venv/
ENV/
env/
八、全文总结
venv 作为 Python 标准库内置的原生方案,免去了第三方虚拟环境工具的额外学习成本与外部依赖。只要牢记核心闭环流程:
- 创建:
python3 -m venv .venv - 激活:macOS/Linux 执行
source .venv/bin/activate,Windows 执行.venv\Scripts\activate - 管理:
pip install与pip freeze > requirements.txt - 退出:
deactivate - 删除:退出后直接删除
.venv文件夹
养成“一个独立项目对应一个虚拟环境”的开发习惯,能从根源上规避不同包之间的版本冲突,让工程依赖始终处于清晰、可控、随时可复现的状态。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













