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 图,把整个流程串起来了。我建议你保存下来,以后配置环境时对照着看。

虚拟环境创建、激活与退出流程 虚拟环境核心流程 1. 创建环境 python -m venv .venv 2. 激活环境 source .venv/bin/activate 3. 安装依赖 pip install -r req.txt 4. 退出环境 deactivate 💡 关键要点 • 创建一次,反复使用。同一个环境可以激活/退出无数次。 • 激活后所有 pip 操作都只影响当前环境,不影响全局。 • 退出后回到全局环境,之前装的包依然在 .venv 里。 venv 和 virtualenv 的激活/退出命令完全一致,学会一个就会另一个

4.7 避坑指南:我踩过的三个坑

讲完了流程,我分享几个真实踩过的坑。你遇到了,直接照着修就行。

  1. 激活后 pip 还是全局的

    我曾经遇到过:明明激活了环境,pip list 显示的却是全局包。后来发现,是因为 PATH 环境变量里,全局 Python 的路径排在 .venv/bin 前面。解决办法:检查 which python 或 where python,确保它指向 .venv/bin/python。如果不是,重新激活一次。

  2. Windows 下 PowerShell 执行策略报错

    前面提过,Activate.ps1 可能被禁止执行。解决方案:Set-ExecutionPolicy RemoteSigned -Scope CurrentUser。或者直接用 CMD 的 activate.bat,省心。

  3. 虚拟环境目录被提交到 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