4、虚拟环境实战:venv与virtualenv的创建、激活与退出
说实话,我刚入行那会儿,根本不知道虚拟环境是什么东西。
项目装包全靠 pip install,一个 site-packages 里塞了几百个包。直到有一天,项目 A 需要 TensorFlow 1.x,项目 B 需要 TensorFlow 2.x,我直接原地崩溃。嗯,从那以后,虚拟环境就成了我配置环境的标配。
这一章,咱们就把 venv 和 virtualenv 这两个工具彻底搞明白。你想想看,它们其实没那么玄乎,就是给你的 Python 项目造一个「独立小房间」。
4.1 为什么需要虚拟环境?
先问一个问题:你装包的时候,有没有遇到过「这个包装不上,因为另一个包版本冲突」?
我遇到过,而且不止一次。最惨的一次,我花了整整一个下午排查,最后发现是 numpy 版本被全局升级给覆盖了。
虚拟环境的核心作用就三个:
- 隔离依赖:每个项目有自己的包,互不干扰
- 版本可控:你可以为项目 A 锁定 Python 3.8,项目 B 用 Python 3.10
- 可复现:配合
requirements.txt,别人一键就能还原你的环境
一句话总结:虚拟环境 = 项目的「专属包仓库」。你在这个项目里装什么,都不会影响到别的项目。
4.2 venv vs virtualenv:到底选哪个?
Python 3.3 之后,官方内置了 venv。很多人问我:「那 virtualenv 是不是就淘汰了?」
其实不是。我个人的习惯是:
- 如果只是普通项目,用
venv就够了,轻量、内置、不用额外装 - 如果需要指定 Python 版本、或者要更快的创建速度,我会用
virtualenv
下面这张表,帮你快速对比:
| 特性 | venv | virtualenv |
|---|---|---|
| Python 版本要求 | Python ≥ 3.3 | Python 2.7+ / 3.x |
| 是否需要安装 | 内置,无需安装 | 需要 pip install virtualenv |
| 指定 Python 版本 | 不支持(只能用当前解释器) | 支持(-p python3.8) |
| 创建速度 | 中等 | 较快(有缓存机制) |
| 跨平台兼容 | 好 | 更好(Windows 下更稳定) |
我的建议:如果你用的是 Python 3.6+,日常开发用 venv 完全够用。只有当你需要「用 Python 3.8 创建环境,但系统默认是 Python 3.10」这种场景时,才上 virtualenv。
4.3 实战:用 venv 创建虚拟环境
好,咱们直接上手。打开终端,进到你的项目目录:
cd my_project
然后执行:
python -m venv .venv
这里 .venv 是环境目录的名字。我习惯用 .venv,因为前面加个点,ls 的时候不会显得乱。你也可以用 env、venv,都行。
创建完成后,目录结构大概是这样:
my_project/
├── .venv/
│ ├── bin/ # Linux/Mac 下的激活脚本
│ ├── Include/
│ ├── Lib/
│ └── pyvenv.cfg
└── your_code.py
在 Windows 下,bin/ 会变成 Scripts/,里面是 activate.bat 和 Activate.ps1。
4.4 激活与退出:你每天都会用的操作
环境创建好了,怎么用?激活它。
Linux / macOS:
source .venv/bin/activate
Windows(CMD):
.venv\Scripts\activate.bat
Windows(PowerShell):
.venv\Scripts\Activate.ps1
激活成功后,你会看到终端前面多了个 (.venv) 前缀:
(.venv) user@machine:~/my_project$
这时候你执行 pip install,所有包都会装到 .venv 里,不会污染全局。
退出环境:
deactivate
就这么简单。前缀消失,回到全局环境。
注意:我曾经遇到过一个问题——在 PowerShell 里执行 Activate.ps1 时报错「无法加载文件,因为在此系统上禁止运行脚本」。这是因为 PowerShell 的执行策略默认是 Restricted。解决办法:以管理员身份运行 PowerShell,执行 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser,然后重试。
4.5 实战:用 virtualenv 创建虚拟环境
如果你需要更灵活的控制,比如指定 Python 版本,那就用 virtualenv。
先安装:
pip install virtualenv
然后创建环境:
virtualenv .venv
指定 Python 3.8 创建:
virtualenv -p /usr/bin/python3.8 .venv
激活和退出的命令,跟 venv 完全一样。所以学会一个,另一个自然就会了。
4.6 核心流程:一张图看懂
下面这张 SVG 图,把整个流程串起来了。我建议你保存下来,以后配置环境时对照着看。
4.7 避坑指南:我踩过的三个坑
讲完了流程,我分享几个真实踩过的坑。你遇到了,直接照着修就行。
-
激活后 pip 还是全局的
我曾经遇到过:明明激活了环境,
pip list显示的却是全局包。后来发现,是因为PATH环境变量里,全局 Python 的路径排在.venv/bin前面。解决办法:检查which python或where python,确保它指向.venv/bin/python。如果不是,重新激活一次。 -
Windows 下 PowerShell 执行策略报错
前面提过,
Activate.ps1可能被禁止执行。解决方案:Set-ExecutionPolicy RemoteSigned -Scope CurrentUser。或者直接用 CMD 的activate.bat,省心。 -
虚拟环境目录被提交到 Git
这个我犯过不止一次。虚拟环境目录(
.venv)不应该提交到版本控制。记得在.gitignore里加上.venv/。别人拉你的代码后,自己创建环境,然后pip install -r requirements.txt就行。
一个小技巧:我习惯在项目根目录放一个 requirements.txt,里面记录所有依赖。每次激活环境后,第一件事就是 pip install -r requirements.txt。这样不管换到哪台机器,都能一键还原环境。
4.8 总结:记住这四步就够了
虚拟环境其实不复杂。你只要记住:
- 创建:
python -m venv .venv - 激活:
source .venv/bin/activate(Linux/Mac)或.venv\Scripts\activate(Windows) - 使用:正常装包、跑代码
- 退出:
deactivate