venv 详解:是什么、怎么用、为什么需要它
一、venv 是什么
venv 是 Python 自带的虚拟环境管理工具。
什么是虚拟环境?简单说就是给每个项目准备一套独立的 Python 运行环境,项目之间互不干扰。
没有虚拟环境时:
所有项目共用一套 Python → A 项目要 requests 2.x,B 项目要 requests 3.x → 打架
有了虚拟环境:
项目A ── 环境A(Python 3.9 + requests 2.28)
项目B ── 环境B(Python 3.11 + requests 3.0)
项目C ── 环境C(Python 3.10 + 一堆数据科学包)
各用各的,互不干扰
venv 是 Python 3.3+ 官方自带的,不用额外安装。
二、解决什么问题
痛点 1:包版本冲突
项目A:需要 Django 3.2(老项目)
项目B:需要 Django 5.0(新项目)
都装在全局 Python 里 → 后者会覆盖前者,总有一个跑不起来
痛点 2:污染系统环境
瞎装了一堆包在全局 Python 里 → 某天卸载错了 → 系统工具崩了 → 傻眼
痛点 3:依赖不好管理
你电脑上跑的好好的,发给同事 → 同事说跑不起来
→ 你装了 30 个包,你自己都记不清项目到底依赖哪些
痛点 4:部署麻烦
部署到服务器 → 不知道要装哪些包 → 一个个试 → 试到天荒地老
venv 的解法:每个项目一个独立环境,依赖干干净净,项目自己管自己的。
三、基础使用
1. 创建虚拟环境
cd 到你的项目目录,然后执行:
bash
python3 -m venv .venv
python3 -m venv:调用 venv 模块.venv:虚拟环境的目录名(叫这个是约定俗成,也可以叫别的,比如venv、env)
执行完,项目里会多出一个 .venv 文件夹,里面就是一套独立的 Python 环境。
你的项目/
├── .venv/
│ ├── bin/ # Mac/Linux:可执行文件(python、pip 等)
│ ├── Scripts/ # Windows:可执行文件
│ ├── lib/ # 库文件
│ └── pyvenv.cfg # 配置信息
├── app.py
└── requirements.txt
2. 激活虚拟环境
Mac / Linux:
bash
source .venv/bin/activate
Windows(PowerShell):
powershell
.venv\Scripts\Activate.ps1
Windows(CMD):
cmd
.venv\Scripts\activate.bat
激活之后,终端提示符前面会多一个 (.venv):
(.venv) user@mac my-project %
这表示你现在用的是这个虚拟环境里的 Python 和 pip。
3. 验证一下
bash
which python3
# 输出类似:/Users/你/项目路径/.venv/bin/python3
which pip
# 输出:/Users/你/项目路径/.venv/bin/pip
python3 --version
pip --version
能看到路径是 .venv 下面的,说明激活成功了。
4. 安装依赖
激活后直接用 pip 装,包就会装在 .venv 里,不影响全局:
bash
pip install requests flask
看看装了啥:
bash
pip list
5. 导出依赖清单
项目要给别人用或者部署到服务器,把依赖导出来:
bash
pip freeze > requirements.txt
生成的 requirements.txt 长这样:
certifi==2024.8.30
charset-normalizer==3.3.2
Flask==3.0.3
idna==3.10
requests==2.32.3
urllib3==2.2.3
别人拿到项目,一条命令就能装好所有依赖:
bash
pip install -r requirements.txt
6. 退出虚拟环境
bash
deactivate
提示符前面的 (.venv) 就消失了,回到系统 Python。
四、完整示例流程
场景:新建一个 Flask 项目
bash
# 1. 建项目目录
mkdir my-flask-app && cd my-flask-app
# 2. 创建虚拟环境
python3 -m venv .venv
# 3. 激活
source .venv/bin/activate
# 4. 安装依赖
pip install flask requests
# 5. 写代码
cat > app.py << 'EOF'
from flask import Flask
import requests
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello Flask!"
if __name__ == '__main__':
app.run()
EOF
# 6. 导出依赖
pip freeze > requirements.txt
# 7. 运行
python app.py
别人拿到你的项目之后
bash
# 1. 拉代码
git clone xxx/my-flask-app.git && cd my-flask-app
# 2. 创建并激活虚拟环境
python3 -m venv .venv
source .venv/bin/activate
# 3. 一键装依赖
pip install -r requirements.txt
# 4. 跑起来
python app.py
环境完全一致,不会出现"我这能跑啊"的问题。
五、常用命令速查
| 命令 | 说明 |
|---|---|
python3 -m venv .venv |
创建虚拟环境 |
source .venv/bin/activate |
激活(Mac/Linux) |
.venv\Scripts\Activate.ps1 |
激活(Windows PowerShell) |
deactivate |
退出虚拟环境 |
pip install xxx |
安装包 |
pip install -r requirements.txt |
从文件批量安装 |
pip freeze > requirements.txt |
导出依赖清单 |
pip list |
查看已安装的包 |
pip uninstall xxx |
卸载包 |
六、什么场景用
| 场景 | 为什么需要 venv |
|---|---|
| 多个 Python 项目 | 不同项目依赖不同版本,隔离起来互不影响 |
| 团队协作 | 用 requirements.txt 保证所有人环境一致 |
| 部署到服务器 | 一个项目一个环境,不会把服务器全局搞乱 |
| 学习新库 | 想试试新库又不想污染全局,建个环境随便玩 |
| CI/CD | 自动化构建时创建干净环境,确保可复现 |
| 不同 Python 版本 | 配合 pyenv 可以给每个项目用不同 Python 版本 |
七、最佳实践
1. .gitignore 里加上 .venv
虚拟环境不要提交到 git,几百兆而且没必要:
# .gitignore
.venv/
venv/
__pycache__/
*.pyc
2. 项目目录结构推荐
my-project/
├── .venv/ # 虚拟环境(不提交 git)
├── src/ # 源码
│ └── app.py
├── requirements.txt # 依赖清单(提交 git)
├── README.md
└── .gitignore
3. 定期清理不用的环境
项目删了别忘了把对应的 .venv 也删掉,不然占空间。
bash
rm -rf .venv
4. 要不要把 venv 放项目里?
大部分情况放项目目录里最方便,但也可以统一放在别处(比如 ~/.venvs/项目名/),看个人习惯。放项目里的好处是找起来方便,删项目一起删。
八、和其他工具的对比
| 工具 | 特点 | 适合人群 |
|---|---|---|
| venv | Python 自带,不用装,功能简单 | 初学者、简单项目 |
| virtualenv | 比 venv 功能多,支持 Python 2 | 老项目、需要更多功能 |
| conda | 不仅管 Python 包,还管系统依赖、Python 版本本身 | 数据科学、多版本环境 |
| poetry | 依赖管理 + 虚拟环境 + 打包发布,一体化 | 中大型项目、追求规范 |
| pipenv | 类似 poetry,Pipfile 替代 requirements | 以前火,现在用的人少了 |
怎么选:
- 新手 / 简单项目 → 用 venv 就够了,自带的最省心
- 做数据科学 / 要装很多非 Python 的东西 → 用 conda
- 正经项目 / 要打包发布 → 用 poetry
九、常见坑
1. 激活失败(Windows PowerShell)
Windows 可能会提示"无法加载文件,因为在此系统上禁止运行脚本",这是执行策略的问题:
powershell
# 以管理员身份打开 PowerShell,执行:
Set-ExecutionPolicy RemoteSigned
# 选 Y 确认
2. 忘了激活就 pip install
装到全局去了,白装了。先 activate 再装。
3. 移动了项目目录
把项目文件夹挪了位置,虚拟环境里的路径是写死的,会坏掉。
解决: 删掉重建,也就几分钟的事:
bash
rm -rf .venv
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
4. requirements.txt 太乱
pip freeze 会把所有包(包括间接依赖)都导出来,有时候太多了不好维护。
更讲究的做法是手动维护 requirements.txt,只写直接依赖,或者用 poetry / pip-tools 这类工具管理。
一句话总结:venv 是 Python 自带的虚拟环境工具,给每个项目创建一套独立的 Python 运行环境,解决依赖冲突、环境不一致的问题,创建、激活、装包、导出四步走,简单好用。