Python venv 详解:为什么要用、怎么用、怎么用好

目录

[一、什么是 venv?](#一、什么是 venv?)

[二、为什么一定要用 venv?(非常重要)](#二、为什么一定要用 venv?(非常重要))

[1️⃣ 不用 venv 会发生什么?](#1️⃣ 不用 venv 会发生什么?)

[2️⃣ venv 解决的核心问题](#2️⃣ venv 解决的核心问题)

[3️⃣ venv 和 Java 的类比(秒懂)](#3️⃣ venv 和 Java 的类比(秒懂))

[三、venv 的基本结构(你看到的到底是什么)](#三、venv 的基本结构(你看到的到底是什么))

[四、如何创建和使用 venv(标准流程)](#四、如何创建和使用 venv(标准流程))

[1️⃣ 创建虚拟环境](#1️⃣ 创建虚拟环境)

[2️⃣ 激活虚拟环境](#2️⃣ 激活虚拟环境)

[Linux / macOS](#Linux / macOS)

Windows(PowerShell)

[3️⃣ 在 venv 中安装依赖](#3️⃣ 在 venv 中安装依赖)

[4️⃣ 退出虚拟环境](#4️⃣ 退出虚拟环境)

[五、如何确认你真的在用 venv?(排错必会)](#五、如何确认你真的在用 venv?(排错必会))

[✅ 看 python 路径](#✅ 看 python 路径)

[✅ 看 pip 路径](#✅ 看 pip 路径)

[❌ 常见错误](#❌ 常见错误)

[六、requirements.txt:venv 的灵魂搭档](#六、requirements.txt:venv 的灵魂搭档)

[1️⃣ 导出依赖](#1️⃣ 导出依赖)

[2️⃣ 一键恢复环境(部署神器)](#2️⃣ 一键恢复环境(部署神器))

[七、venv vs virtualenv vs conda](#七、venv vs virtualenv vs conda)

[八、生产环境使用 venv 的最佳实践(重点)](#八、生产环境使用 venv 的最佳实践(重点))

[✅ 1. venv 和项目放一起](#✅ 1. venv 和项目放一起)

[✅ 2. 不要把 venv 提交到 Git](#✅ 2. 不要把 venv 提交到 Git)

[✅ 3. systemd / shell 脚本中明确使用 venv](#✅ 3. systemd / shell 脚本中明确使用 venv)

[✅ 4. 不依赖 activate(非常重要)](#✅ 4. 不依赖 activate(非常重要))

[九、你之前 Label Studio 场景,其实就是 venv 的典型用法](#九、你之前 Label Studio 场景,其实就是 venv 的典型用法)

十、常见坑总结(一定要避)

一句话总结(记住这个)


一、什么是 venv?

venvPython 官方自带的虚拟环境工具(Python 3.3+ 内置),用于:

为某一个 Python 项目创建"独立的运行环境"

在这个环境里:

  • Python 解释器是独立的

  • 第三方库是独立的

  • 不影响系统 Python

  • 不影响其他项目

一句话理解:

venv = 项目级 Python 运行环境隔离器


二、为什么一定要用 venv?(非常重要)

1️⃣ 不用 venv 会发生什么?

假设你有两个项目:

  • 项目 A:需要 Django==3.2

  • 项目 B:需要 Django==4.2

如果你直接:

复制代码

pip install django

结果只能二选一,另一个项目直接炸 💥


2️⃣ venv 解决的核心问题

问题 venv 是否解决
依赖冲突
多项目共存
系统 Python 被污染
版本可复现
部署一致性

3️⃣ venv 和 Java 的类比(秒懂)

Java Python
Maven 本地仓库 pip cache
JDK 版本 Python 解释器
项目 classpath venv

👉 每个项目一个 venv = 每个项目一个 classpath


三、venv 的基本结构(你看到的到底是什么)

创建一个 venv 后,目录通常是这样:

复制代码

venv/ ├── bin/ # Linux / macOS 可执行文件 │ ├── python │ ├── pip │ └── activate ├── lib/ │ └── python3.x/ │ └── site-packages/ # 第三方库都在这 ├── include/ └── pyvenv.cfg

📌 重点记住这 3 点:

  • bin/python:这个环境专用的 Python

  • bin/pip:只给这个环境装包

  • site-packages:库真正存放的位置


四、如何创建和使用 venv(标准流程)

1️⃣ 创建虚拟环境

复制代码

python3 -m venv venv

推荐命名:

  • venv

  • .venv


2️⃣ 激活虚拟环境

Linux / macOS
复制代码

source venv/bin/activate

Windows(PowerShell)
复制代码

venv\Scripts\Activate.ps1

激活成功后,终端前面会看到:

复制代码

(venv) user@host:~$


3️⃣ 在 venv 中安装依赖

复制代码

pip install requests flask

📌 只会安装到当前 venv,不影响系统


4️⃣ 退出虚拟环境

复制代码

deactivate


五、如何确认你真的在用 venv?(排错必会)

✅ 看 python 路径

复制代码

which python

输出应类似:

复制代码

/path/to/project/venv/bin/python


✅ 看 pip 路径

复制代码

which pip


❌ 常见错误

复制代码

pip install xxx python app.py

但 python 不是 venv 的 python → 白装


六、requirements.txt:venv 的灵魂搭档

1️⃣ 导出依赖

复制代码

pip freeze > requirements.txt


2️⃣ 一键恢复环境(部署神器)

复制代码

python -m venv venv source venv/bin/activate pip install -r requirements.txt

👉 这一步就是"环境可复现"的核心


七、venv vs virtualenv vs conda

工具 特点 推荐场景
venv 官方、轻量 Web / 脚本 / 服务
virtualenv 功能更多 老项目
conda 带 Python + C 库 数据科学 / AI

📌 你的场景(服务 + 脚本)→ venv 是最合适的


八、生产环境使用 venv 的最佳实践(重点)

✅ 1. venv 和项目放一起

复制代码

project/ ├── venv/ ├── app.py ├── requirements.txt


✅ 2. 不要把 venv 提交到 Git

.gitignore

复制代码

venv/ .venv/


✅ 3. systemd / shell 脚本中明确使用 venv

❌ 不要这样:

复制代码

java app.py

✅ 要这样:

复制代码

/opt/app/venv/bin/python app.py


✅ 4. 不依赖 activate(非常重要)

生产环境推荐写死解释器路径

复制代码

/opt/app/venv/bin/python main.py

source activate 稳定得多。


九、你之前 Label Studio 场景,其实就是 venv 的典型用法

你现在的路径:

复制代码

/data/labelstudio/venv/bin/label-studio

说明:

  • Label Studio 依赖都在这个 venv

  • 系统 Python 是干净的

  • 升级、删除都不影响系统

👉 这是标准、正确、专业的用法


十、常见坑总结(一定要避)

❌ venv 里装包,系统 python 跑

❌ 删除 venv 却不重新 install

❌ 多个项目共用一个 venv

❌ requirements.txt 不更新


一句话总结(记住这个)

venv 不是"可选项",而是 Python 项目的"标配基础设施

相关推荐
zyeyeye1 小时前
自定义类型:结构体
c语言·开发语言·数据结构·c++·算法
老赵全栈实战2 小时前
《从零搭建RAG系统第3天:文档加载+文本向量化+向量存入Milvus》
python
火龙果研究院2 小时前
在CentOS上安装Python 3.13需要从源码编译
开发语言·python·centos
invicinble2 小时前
关于学习技术栈的思考
java·开发语言·学习
龙山云仓2 小时前
No156:AI中国故事-对话司马迁——史家绝唱与AI记忆:时间叙事与因果之链
大数据·开发语言·人工智能·python·机器学习
niuniudengdeng2 小时前
一种基于高维物理张量与XRF实景复刻的一步闭式解工业级3D打印品生成模型
人工智能·python·数学·算法·3d
航哥的女人2 小时前
C++文件操作
开发语言·c++
overmind2 小时前
oeasy Python 114 在列表指定位置插入insert
开发语言·python
github.com/starRTC2 小时前
Claude Code中英文系列教程34:再谈Skills
开发语言·c#·ai编程