第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搞混。
创建虚拟环境
virtualenv myenv
这会在当前目录下生成一个myenv文件夹。里面包含了独立的Python解释器和pip。
你也可以指定Python版本:
virtualenv -p python3.8 myenv
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」,然后手动指定一个已经建好的虚拟环境。这样多个项目可以共用同一个环境,省磁盘空间。
给已有项目配置虚拟环境
- 打开 PyCharm,进入 File → Settings(macOS 是 Preferences)
- 找到 Project: 你的项目名 → Python Interpreter
- 点击齿轮图标 → Add
- 选择 Existing environment,然后找到你的虚拟环境路径
- 点击 OK 确认
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配合起来,才是真正的生产力工具。