第2章:虚拟环境管理——让项目依赖不再打架

做Python开发,最头疼的问题之一就是依赖冲突。你可能遇到过这种情况:项目A需要Django 2.2,项目B却要Django 4.0。装来装去,系统环境乱成一锅粥。嗯,虚拟环境就是来解决这个问题的。

说白了,虚拟环境就是给每个项目一个独立的Python解释器空间。你在这个环境里装什么包,都不会影响到别的项目。我个人习惯是,每个新项目都先建一个虚拟环境,这已经成了肌肉记忆。

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

virtualenv是Python社区最早流行的虚拟环境工具。虽然现在有venv了,但很多老项目还在用,你得会。

安装virtualenv

pip install virtualenv

就这么简单。如果你用的是Python 3,我建议直接用pip3,避免跟系统Python 2搞混。

小提示: 如果你在macOS或Linux上遇到权限问题,记得加 --user 参数。我刚开始用的时候就被这个坑过。

创建虚拟环境

virtualenv myenv

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

你也可以指定Python版本:

virtualenv -p python3.8 myenv
重要: 创建时指定的Python版本,必须是你系统里已经安装好的。我曾经在服务器上想用Python 3.10,结果系统里只有3.8,创建直接报错。

2.2 venv:Python官方推荐,从3.3开始自带

从Python 3.3开始,官方内置了venv模块。说白了就是不用额外安装,直接用。我个人现在基本都用venv,省事。

使用venv创建虚拟环境

python -m venv myenv

注意这里的写法:python -m venv,意思是把venv当模块运行。跟virtualenv比起来,venv更轻量,功能也够用。

对比项 virtualenv venv
是否需要安装 需要 pip install Python 3.3+ 自带
Python版本支持 Python 2 和 3 仅 Python 3
创建速度 稍慢 较快
功能丰富度 更多选项 基础够用

你想想看,如果只是做普通项目,venv完全够用。除非你要兼容Python 2的老项目,那才需要virtualenv。

2.3 虚拟环境的激活与退出

创建好环境,你得激活它才能用。不同操作系统命令不一样,这里我列出来。

Windows系统

# 激活
myenv\Scripts\activate

# 退出
deactivate

macOS / Linux系统

# 激活
source myenv/bin/activate

# 退出
deactivate

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

注意: 激活后,你安装的所有包都只在这个环境里生效。我曾经犯过一个错:激活了环境,但忘了看前缀,结果包装到了系统环境里。后来排查了半天才发现。

验证是否在虚拟环境中

# 查看Python路径
which python   # macOS/Linux
where python   # Windows

如果路径指向你的项目目录下的myenv/bin/python,那就对了。

2.4 在PyCharm中配置虚拟环境

PyCharm是我最常用的IDE。它跟虚拟环境的配合,可以说是无缝衔接。

新建项目时配置

创建新项目时,PyCharm会弹出一个窗口。在「Interpreter」那里,选择「New environment using」。默认就是Virtualenv或venv。你选好就行。

我个人习惯选「Existing interpreter」,然后手动指定一个已经建好的虚拟环境。这样多个项目可以共用同一个环境,省磁盘空间。

给已有项目配置虚拟环境

  1. 打开 PyCharm,进入 File → Settings(macOS 是 Preferences)
  2. 找到 Project: 你的项目名 → Python Interpreter
  3. 点击齿轮图标 → Add
  4. 选择 Existing environment,然后找到你的虚拟环境路径
  5. 点击 OK 确认
技巧: 配置好后,PyCharm会自动识别虚拟环境里的所有已安装包。你可以在设置界面直接搜索和安装新包,不用敲命令行。

2.5 避坑指南:我踩过的那些坑

做虚拟环境管理这么多年,有些坑我至今记忆犹新。

坑一: 虚拟环境不要放在项目代码里。我曾经把虚拟环境文件夹跟代码混在一起,结果上传到Git时,把几百兆的环境文件也传上去了。后来同事拉代码,等了半小时。正确的做法是:虚拟环境放在项目根目录外,或者用 .gitignore 忽略掉。

坑二: 虚拟环境不要跨操作系统迁移。Windows上创建的虚拟环境,拿到Linux上直接报错。因为路径格式不一样。我试过把Windows的环境打包发给同事,结果人家根本用不了。正确的做法是:用 requirements.txt 记录依赖,到新环境重新安装。

# 导出依赖
pip freeze > requirements.txt

# 在新环境安装
pip install -r requirements.txt

坑三: 激活环境后,不要用 sudo 安装包。在Linux上,如果你用 sudo pip install,包会装到系统环境里,而不是虚拟环境。我刚开始用Linux时,这个问题困扰了我整整两天。

2.6 小结

虚拟环境管理,说白了就是给每个项目一个独立的空间。virtualenv和venv都能用,我个人推荐venv,因为不用额外安装。激活和退出记住那几条命令就行。PyCharm里配置起来也很方便。

下一章我们会讲包管理工具pip的进阶用法。到时候你会看到,虚拟环境跟pip配合起来,才是真正的生产力工具。