3. 虚拟环境

说实话,我刚入行那会儿,根本不知道虚拟环境是什么东西。

那时候写Python项目,所有依赖全装全局。今天装个Django 2.0,明天项目要用Django 3.2,直接升级全局。结果呢?老项目炸了,新项目也跑不起来。嗯,这种痛,经历过的人都懂。

1.1 为什么需要虚拟环境?

说白了,虚拟环境就是给每个项目一个独立的“小房间”。

每个房间里有自己的一套Python解释器、自己的依赖包。A项目用Django 2.0,B项目用Django 3.2,互不干扰。你想想看,这多省心。

核心痛点:没有虚拟环境时,全局依赖冲突会让你怀疑人生。

我在项目中遇到过最典型的情况:

  • 项目A需要 requests==2.25.0
  • 项目B需要 requests==2.26.0
  • 两个项目同时维护,全局只能装一个版本

怎么办?要么你手动来回切换,要么你就等着某个项目报错。虚拟环境就是来解决这个问题的。

1.2 venv vs virtualenv:选哪个?

Python 3.3 之后,官方内置了 venv 模块。我个人的习惯是:

工具 适用场景 备注
venv Python 3.3+ 标准项目 官方推荐,轻量够用
virtualenv 需要兼容 Python 2/3 功能更丰富,但需要额外安装

如果你用的是 Python 3.3 以上,直接用 venv 就够了。我早期维护过一个老项目,还在用 Python 2.7,那时候只能用 virtualenv。现在嘛,基本都用 venv 了。

我的建议:新项目一律用 venv,除非你有特殊需求。

1.3 创建与使用虚拟环境

来,直接上代码。创建虚拟环境其实就一行命令:

# 使用 venv 创建虚拟环境
python -m venv myenv

这会在当前目录下生成一个 myenv 文件夹。里面包含了独立的 Python 解释器和 pip。

激活虚拟环境:

# Windows
myenv\Scripts\activate

# macOS / Linux
source myenv/bin/activate

激活后,你会看到命令行前面多了 (myenv) 字样。这时候你安装的所有包,都只在这个环境里生效。

注意:我曾经犯过一个低级错误——忘记激活虚拟环境就直接 pip install。结果包装到了全局,项目里死活 import 不到。嗯,从那以后我每次都会先检查命令行前缀。

退出虚拟环境也很简单:

deactivate

如果你用 virtualenv,命令几乎一样:

# 安装 virtualenv
pip install virtualenv

# 创建虚拟环境
virtualenv myenv

# 激活和退出跟 venv 一样
source myenv/bin/activate
deactivate

1.4 虚拟环境的核心逻辑

为了让你更直观地理解,我画了一张图:

全局环境 Python 3.9 Django 2.0 requests 2.25.0 numpy 1.19.0 项目A 虚拟环境 Python 3.8 Django 2.2 requests 2.24.0 项目B 虚拟环境 Python 3.10 Django 4.0 requests 2.26.0 全局环境:所有项目共享 虚拟环境:每个项目独立,互不干扰

看到没?每个虚拟环境都是独立的。项目A用Django 2.2,项目B用Django 4.0,全局环境里装的是Django 2.0。三个版本共存,谁也不影响谁。

1.5 避坑指南

我踩过的坑,你就不用再踩了:

  • 不要把虚拟环境文件夹提交到Git仓库。它太大了,而且每个人的路径可能不同。用 requirements.txt 来记录依赖就好。
  • 记得在项目根目录创建虚拟环境。我见过有人把虚拟环境建在桌面,结果项目换台电脑就找不到了。
  • 激活后再安装包。我曾经在没激活的情况下装了半小时的包,最后发现全装到了全局。

小技巧:创建虚拟环境后,第一时间生成 requirements.txt:

pip freeze > requirements.txt

这样别人拿到你的项目,直接 pip install -r requirements.txt 就能复现环境。

好了,虚拟环境这块儿就讲这么多。说白了,它就是给你每个项目一个干净、独立的空间。别嫌麻烦,养成习惯后你会发现,这玩意儿真香。

可可精品资料库