QUOTE
虚拟环境不是“高级玩法”,而是避免依赖冲突、让项目干净可部署的基本功。
—— 测试逆转大师
本文看点
02
virtualenv / virtualenvwrapper
想象一个常见的场景:你手上有两个 Python 项目,项目 A 依赖 requests==2.25.1,项目 B 依赖 requests==2.28.0。如果都在系统全局环境安装,先装 2.25.1,再装 2.28.0——版本升级了,项目 A 就跑不通了;反过来也一样。这就是版本冲突,在依赖多的大型项目里几乎不可避免。 除了版本打架,还有更隐蔽的问题:某个库卸载后残留的依赖、全局 pip install 装了一堆“试试看”的包导致环境臃肿、部署时因为本地环境和服务端不一致而疯狂报错……这些问题的根源都是——项目环境没有隔离。 用虚拟环境把每个项目的依赖圈在独立目录里,系统全局环境始终保持干净。好处总结:
**解决不同项目之间的包依赖冲突**——每个项目有自己的 `site-packages`;
**项目自动化部署省麻烦**——线上服务器用同一个虚拟环境镜像,就不会出现“我本地能跑,线上不行”;
**方便依赖管理**——一键导出依赖清单,新同事克隆项目后一条命令装齐所有包。
「简单说:虚拟环境就是给每个项目开一个“隔离舱”,互不干扰。」
Python 3.3 以后官方内置了 venv 模块(用法:python3 -m venv myenv),但 virtualenv 作为第三方工具,功能更完善、兼容性更好,社区里使用更广泛。下面以 virtualenv 为主讲解。
2.1 安装
pip install virtualenv
pip uninstall virtualenv # 卸载
安装完成后可以验证版本:
REFERENCE
如果提示找不到命令,检查 pip 是否指向当前使用的 Python 版本,必要时用 pip3 install virtualenv。
2.2 创建虚拟环境
先建一个存放虚拟环境的目录,然后在里面创建环境:
mkdir virtualenv
cd virtualenv
virtualenv ENV
上面的 ENV 是虚拟环境的名字,可以自定义。执行后会在当前目录下生成一个 ENV 文件夹,里面有独立的 Python 解释器和 pip。 如果想指定 Python 版本创建,用 -p 参数:
virtualenv -p /usr/local/bin/python3.9 ENV
REFERENCE
这一步的意思是:在 ENV 目录里放一份独立的 Python 运行环境,后续所有 pip install 操作都只影响这个目录,不污染系统全局。
2.3 激活虚拟环境
Mac/Linux 下激活:
source /Users/你的用户名/virtualenv/ENV/bin/activate
激活成功后,终端提示符前面会出现 (ENV) 标识,表示你已经在虚拟环境里操作了。此时运行 which python,返回的路径应该是虚拟环境内的 Python,而不是系统的。
2.4 在虚拟环境里安装依赖
pip install requests
pip install pytest
这些包只装在 ENV 目录的 site-packages 里,系统全局完全不受影响。
2.5 退出虚拟环境
退出后提示符 (ENV) 消失,python 和 pip 恢复为系统默认版本。
「常见踩坑:退出后发现包还是虚拟环境里的——检查是不是在虚拟环境内执行了 `deactivate`,确认提示符已恢复正常。」
03
SECTION
三、virtualenvwrapper 扩展
用 virtualenv 手动管理环境,需要记住每个环境的路径、手动 source 激活,环境多了容易混乱。virtualenvwrapper 是对 virtualenv 的封装,把所有虚拟环境统一放在一个目录下,提供快捷命令来创建、切换、删除环境,大幅降低管理成本。
3.1 安装
pip install virtualenvwrapper
3.2 环境变量配置
安装后需要配置环境变量,告诉 virtualenvwrapper 用哪个 Python、把虚拟环境存到哪里。先查脚本位置:
which virtualenvwrapper.sh
然后编辑 ~/.zshrc(如果你用 bash 则编辑 ~/.bashrc),在末尾添加:
export VIRTUALENVWRAPPER_PYTHON=/Library/Frameworks/Python.framework/Versions/3.9/bin/python3.9
export WORKON_HOME=/Users/你的用户名/virtualenv
source /Library/Frameworks/Python.framework/Versions/3.9/bin/virtualenvwrapper.sh
保存后执行 source ~/.zshrc 使配置生效。
REFERENCE
两个关键变量的含义:VIRTUALENVWRAPPER_PYTHON 指定虚拟环境使用的 Python 解释器路径;WORKON_HOME 指定所有虚拟环境的统一存放目录。
3.3 常用命令
`mkvirtualenv 名称`:新建虚拟环境(自动激活);
`lsvirtualenv -b`:列出所有虚拟环境;
`workon 环境名称`:切换到指定虚拟环境(无需记路径);
`cpvirtualenv 名称1 名称2`:复制虚拟环境;
`deactivate`:退出当前虚拟环境;
`rmvirtualenv 环境名称`:删除虚拟环境。
REFERENCE
对比原生 virtualenv:workon 一条命令切换环境,不再需要手拼 source 路径;mkvirtualenv 创建后自动激活,省了手动激活步骤。
3.4 常见错误
错误一:报 `No module named virtualenvwrapper` 原因:系统默认 Python 是 2.7(macOS 自带),但 virtualenvwrapper 装在 Python 3 下。终端执行 virtualenvwrapper.sh 时用的是 Python 2.7,找不到模块。 解决:让 VIRTUALENVWRAPPER_PYTHON 指向 Python3 的真实安装路径,不要用软连接。用 which python3 或 ls /Library/Frameworks/Python.framework/Versions/ 找到真实路径。 错误二:初始化钩子报错 同样的问题——VIRTUALENVWRAPPER_PYTHON 指向了软连接而非真实路径。把变量值改成类似 /usr/local/python3/bin/python3 的真实地址即可。
REFERENCE
避坑要点:macOS 上 Python 2.7 和 Python 3 共存是最常见的坑。凡是环境变量里指定 Python 路径的地方,都用 which python3 找到的真实路径,别偷懒用 python(它可能指向 2.7)。
04
SECTION
四、导出与恢复依赖:pip freeze
虚拟环境搞好了,怎么让团队其他人或部署服务器快速复现同样的依赖?答案是 pip freeze。 导出当前环境的所有依赖到文件:
pip freeze > requirements.txt
生成的 requirements.txt 内容类似:
requests==2.28.0
pytest==7.2.0
playwright==1.30.0
在新环境里一键恢复:
pip install -r requirements.txt
REFERENCE
实操建议:每次项目依赖有变化,记得重新执行 pip freeze > requirements.txt。把 requirements.txt 和代码一起提交到版本库,这是团队协作的基本规范。
Windows 用户注意:virtualenvwrapper 在 Windows 上有专门版本 virtualenvwrapper-win,命令略有差异。 安装:
pip install virtualenv
pip install virtualenvwrapper-win
验证安装:进入安装目录输入 .\workon,出现虚拟环境列表即安装成功。 配置 WORKON_HOME 环境变量(建议在系统环境变量中设置),指定虚拟环境存放目录,如 D:\python_env。如果不配置,默认建到 C:\Users\你的用户名\Envs\,路径太深不方便管理。 常用命令:
创建:`mkvirtualenv 环境名字`
切换:`workon 环境名字`
退出:`deactivate`
删除:`rmvirtualenv 环境名字`
REFERENCE
Windows 踩坑提醒:如果 PowerShell 执行脚本报权限错误,需要先执行 Set-ExecutionPolicy RemoteSigned 开放脚本权限。另外 virtualenvwrapper-win 不支持 lsvirtualenv,用 workon(不带参数)来查看列表。
Linux 服务器是部署的主战场,虚拟环境同样必不可少。装到 /usr/local 下确保全局可用:
pip3 install virtualenv --prefix=/usr/local
ls /usr/local/bin/virtualenv
确认 virtualenv 可执行文件存在后,开始创建和使用:
virtualenv venv
source venv/bin/activate
which python
which python 应该返回 venv 目录下的 Python 路径,说明虚拟环境激活成功。 停用:deactivate。多环境切换时要先停用当前环境、再激活另一个。 完整示例——创建两个环境并切换:
virtualenv env1
virtualenv env2
source env1/bin/activate
# 在 env1 里工作...
deactivate
source env2/bin/activate
# 在 env2 里工作...
which python
REFERENCE
Linux 避坑要点:如果 pip3 没装,先执行 sudo apt install python3-pip(Ubuntu/Debian)或 sudo yum install python3-pip(CentOS)。另外在服务器上建议用 virtualenvwrapper 统一管理,配置方式和 Mac 一致,只是脚本路径改为 ~/.bashrc。
环境乱了,代码再对也跑不通。花十分钟把虚拟环境用顺,后面省下的是无数个排查依赖的下午。 三个平台做法不同但目的一样:Mac 用 virtualenvwrapper + zshrc,Windows 用 virtualenvwrapper-win,Linux 用 virtualenv + virtualenvwrapper + bashrc。核心流程都是:创建 → 激活 → 装依赖 → 导出依赖清单。 学习自动化测试,关注 测试逆转大师。
我是 测试逆转大师,专注 Playwright 与自动化测试实战,持续分享能直接上手的技术干货。
如果你觉得今天这篇有收获,欢迎点赞、在看、转发三连,我们下篇见。