3、虚拟环境:virtualenv的安装与使用、venv模块的使用、虚拟环境的激活与退出

说到网络配置下的包依赖问题,我第一个想聊的就是虚拟环境。

你想想看,我们做网络自动化,Python脚本里动不动就要装 netmiko、napalm、paramiko、ncclient 这些库。今天这个项目要 netmiko 3.x,明天那个项目可能只兼容 2.x。要是全装到系统 Python 里,那不乱套才怪。

虚拟环境就是干这个的——给每个项目一个独立的 Python 小天地。说白了,就是隔离。

3.1 virtualenv:老牌工具,依然能打

virtualenv 是 Python 虚拟环境的元老级工具。我最早接触它是在 2015 年,那时候还没有 venv 模块,大家全靠它。

安装 virtualenv

如果你用的是 Python 2 或者比较老的 Python 3 版本,virtualenv 需要单独安装:

pip install virtualenv

我个人习惯用 pip list 确认一下安装是否成功:

pip list | grep virtualenv
小提示: 如果你用的是 Python 3.3+,其实系统自带了 venv 模块,不一定非要装 virtualenv。但我还是建议你两个都了解,毕竟有些老项目还在用 virtualenv。

创建虚拟环境

假设我们有个网络自动化项目,叫 net_auto_project。进入项目目录后,执行:

virtualenv venv

这条命令会在当前目录下生成一个 venv 文件夹。里面包含了独立的 Python 解释器、pip、以及标准库。

如果你想指定 Python 版本,比如用 Python 3.8:

virtualenv -p /usr/bin/python3.8 venv

我在项目中遇到过一个问题:服务器上有多个 Python 版本,默认的 python3 是 3.6,但某个库只支持 3.8+。这时候 -p 参数就派上用场了。

激活与退出

创建好虚拟环境后,得激活它才能用。不同操作系统命令不一样:

操作系统 激活命令
Linux / macOS source venv/bin/activate
Windows (CMD) venv\Scripts\activate.bat
Windows (PowerShell) venv\Scripts\Activate.ps1

激活后,你会看到命令行前面多了 (venv) 字样。嗯,看到这个就说明你已经在虚拟环境里了。

退出很简单,直接敲:

deactivate
注意: 我曾经犯过一个低级错误——在虚拟环境里装了一堆包,然后忘了激活就直接运行脚本。结果报错说找不到模块。你想想看,折腾了半小时才发现是环境没激活。所以每次跑脚本前,先看一眼命令行前面有没有 (venv)。

3.2 venv:Python 3 自带的亲儿子

从 Python 3.3 开始,官方就内置了 venv 模块。它的用法和 virtualenv 几乎一样,但不需要额外安装。

创建虚拟环境

同样在项目目录下:

python3 -m venv venv

注意这里的 -m venv 是调用模块的方式。第一个 venv 是模块名,第二个 venv 是目录名。你也可以改成别的名字,比如 python3 -m venv myenv。

我个人更推荐用 venv,原因有三:

  • 不用额外安装,开箱即用
  • 官方维护,兼容性好
  • 轻量,没有多余依赖

激活与退出

激活命令和 virtualenv 完全一样:

# Linux / macOS
source venv/bin/activate

# Windows
venv\Scripts\activate

退出也是 deactivate。

核心区别: virtualenv 支持 Python 2 和更老的 Python 3 版本,而 venv 只支持 Python 3.3+。如果你还在维护 Python 2 的老项目,那只能用 virtualenv。

3.3 虚拟环境的激活与退出:细节决定成败

激活和退出看起来简单,但有几个细节我不得不提。

激活后发生了什么?

激活虚拟环境后,PATH 环境变量会被修改。系统会优先使用 venv/bin 目录下的 Python 和 pip。所以当你执行 python 或 pip 时,实际上用的是虚拟环境里的版本。

你可以用 which python 或 where python 来验证:

# 激活前
$ which python
/usr/bin/python3

# 激活后
$ source venv/bin/activate
(venv) $ which python
/home/user/net_auto_project/venv/bin/python3

看到路径变了,说明环境生效了。

退出后呢?

执行 deactivate 后,PATH 会恢复原样。Python 和 pip 又指向系统默认的了。

避坑指南: 我曾经在虚拟环境里用 pip install 装了一堆包,然后直接关掉了终端。下次打开新终端,忘了激活环境,又用 pip install 装了一遍。结果系统 Python 里也装了一份,虚拟环境里也装了一份。后来排查问题才发现是两套环境混了。所以我的习惯是:每次打开终端,第一件事就是激活对应的虚拟环境。

3.4 知识体系:一张图看懂虚拟环境

下面这张 SVG 图,是我梳理的虚拟环境核心逻辑。你看一眼就能明白整个流程:

虚拟环境核心逻辑图 virtualenv pip install virtualenv venv(内置模块) python3 -m venv venv 创建虚拟环境 生成独立 Python 解释器 + pip + 标准库 激活虚拟环境 source venv/bin/activate → PATH 修改 安装包 pip install netmiko 退出环境 deactivate → PATH 恢复

这张图从左到右展示了两个工具的选择,然后汇聚到创建环境、激活环境、最后操作。你跟着箭头走一遍,心里就有数了。

3.5 实战建议:我推荐你用哪个?

说了这么多,到底用 virtualenv 还是 venv?

我的建议很简单:

  • 新项目:直接用 venv。Python 3.3+ 都自带,省事。
  • 老项目:如果项目文档里明确写了用 virtualenv,那就跟着走。别自作主张换工具,容易出兼容性问题。
  • 跨版本需求:如果你需要在 Python 2 和 Python 3 之间切换,virtualenv 更灵活。

嗯,虚拟环境这块就聊到这儿。记住一句话:每个项目一个虚拟环境,别偷懒。我在运维生涯里见过太多因为环境混乱导致的故障,真的不值得。