venv 详解

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 运行环境,解决依赖冲突、环境不一致的问题,创建、激活、装包、导出四步走,简单好用。

相关推荐
笨笨饿1 小时前
#142_VS Code.map文件插件的用法
git·python·stm32·单片机·嵌入式硬件·物联网·vim
zwd20051 小时前
Manim 竖屏 1080×1920 配置详解:pixel_width、frame_width 怎么写(0.21.0 / 0.22.0 实测)
python·manim·数学动画·短视频制作·manim教程·竖屏视频
Nontee1 小时前
Quartz 新手入门:定时任务的两个承诺
开发语言·windows·python
wewowilling1 小时前
LangChain入门
python·ai·langchain·prompt
haluhalu.2 小时前
深入理解AIAgent(1.3)--- 设计模式
人工智能·python·设计模式·langchain
估值探索者2 小时前
【Python量化选股流水线 #03】候选股怎么排序?动量+低波+流动性三因子打分取 Top-N
开发语言·python·接口·api接口·股票数据接口·数据接口·股票数据api接口
骑士雄师2 小时前
supervisor 中关于上下文多轮信息维护常用到的python语法
开发语言·python
青少儿编程课堂2 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C/C++考级:任意进制互转与大数多进制加法解析
c++·python·算法·bfs·信息学竞赛
Orchestrator_me2 小时前
k8s网络与应用
网络·python·kubernetes