☰
虚拟环境 venv:把你的测试工具隔离开
2026/10/15 13:52:22 网站建设 项目流程

背景说明

你进组之后,大概率会遇到这样的情况:A 项目的脚本跑得好好的,B 项目一运行就报ImportError: cannot import name xxx。你以为是代码出现了问题——其实不是,只是环境乱了。

上一篇我们把 Python 装好了,但所有包装在同一个「系统 Python」里。今天装 pytest,明天装 requests,后天又装个 allure,装着装着就互相打架了。今天这篇就讲怎么给每个项目单独开一份干净的环境,即venv(虚拟环境)。

很多初学者会有疑问:我用 PyCharm 新建 Project 的时候,IDE 会自动帮我生成.venv,那不就已经有虚拟环境了?为什么还要手动敲命令创建 venv?下面我们把两种创建方式讲清楚。

一、基础知识

为什么要隔离?举个例子:你在系统 Python 里装了 requests 2.25,另一个项目要用 requests 2.31 的新功能,一升级的话,低版本项目就得崩。这就是「依赖冲突」。

于是venv 做的事就很简单——给每个项目单独开一份干净的空间,项目 A 用 2.25,项目 B 用 2.31,互不干扰。

两种创建虚拟环境的方式

方式1:PyCharm 新建项目自动生成 venv(图形界面方式)

在 PyCharm 新建工程时,默认选中Project venv → Generate new,Type 选择 Virtualenv(旧版默认选项为New virtual environment using venv)。

补充:Select existing选项,则是选择之前创建好的虚拟环境。

当你点击创建,IDE 在底层自动执行了一遍python -m venv .venv,在项目目录生成名为.venv(带点,代表隐藏目录)的虚拟环境文件夹,同时自动完成环境激活、解释器绑定。

✅ 优点

  • 本地开发开箱即用,不用记任何命令,上手简单。
  • 自动把当前项目绑定到对应 venv,在编辑器内执行运行、调试,默认就走隔离环境,不容易误装包到系统 Python。

❌ 局限与短板

  1. 强依赖 PyCharm。服务器 Linux、VS Code、vim、CI自动化流水线没有这套图形界面,不能靠“新建Project”来创建环境。
  2. 一个 PyCharm Project窗口默认绑定一套venv。如果同一套代码需要切换多套Python/依赖版本做测试(比如同一脚本分别在pytest7、pytest8下验证兼容性),只靠新建Project就要复制整套代码文件夹,操作笨重,产生大量重复代码副本。
  3. 接手别人的历史项目、拿到解压的脚本源码包时,项目本身不存在 PyCharm工程配置,也没有自带 venv,没法直接点新建项目复用原有代码。

注意:新建 Project ≠ 创建虚拟环境。Project存放你的业务代码;venv是独立隔离的Python运行环境。二者可以多对多:一个项目可以切换多个venv;同一个venv理论上也可以被多个项目引用(但工作中不推荐)。

方式2:命令行手动创建 venv

Windows 上:先 cd 到你的项目文件夹, 再输入命令 python -m venv .venv。

macOS / Linux 上:

$ python3 -m venv venv

这句命令的意思是:用 Python 自带的 venv 模块,在当前目录建一个名为venv的文件夹,里面复制了一份干净的 Python。执行完你会看到多了个venv文件夹,里面有Scripts/(Windows)或bin/(mac/Linux)、Lib/(或 lib/)和pyvenv.cfg。Scripts里那个activate就是激活入口。

如果你想生成和PyCharm同名的隐藏环境目录,也可以写成python -m venv .venv,效果完全一致。

建好不等于进去,你要「激活」它: Windows:

注意看命令行最前面多了个(venv)——这就代表你进屋了。进了屋之后pip install装的包,全都只住在这个 venv 里,就不会碰系统 Python。

macOS / Linux:

$ source venv/bin/activate (venv) $

验证一下现在用的是不是「小房间里的 Python」:

Windows 用where python,mac/Linux 用which python。出来的路径里带venv,就说明隔离成功了。

要退出虚拟环境,一句命令:deactivate

当看到(venv)消失了,你就回到系统 Python。进屋装完包,最好记一笔清单,方便以后重来或给别人用:

(venv) C:\test_auto> pip freeze > requirements.txt

这条把当前环境里所有包和版本号写进requirements.txt,比如里面可能是pytest==8.2.0、requests==2.31.0。下次换台电脑或同事要跑你的项目,一句就还原:

(venv) C:\test_auto> pip install -r requirements.txt

✅ 为什么工作中必须掌握手动命令方式?

  1. 服务器部署场景:线上Linux服务器只有终端,没有PyCharm,只能命令行创建、激活环境,执行自动化脚本。你不能登录服务器去点“新建Project”。
  2. 接手第三方/历史源码包:拿到压缩好的自动化代码,里面只有py源码、配置文件,没有.venv,没有PyCharm工程文件。需要手动构建虚拟环境,再依靠 requirements.txt 还原全部依赖。
  3. 同一项目多环境兼容测试:一份业务代码,创建多个不同版本的venv,编辑器只切换解释器,不需要复制整套项目文件夹,用来验证脚本在不同依赖版本下是否兼容。
  4. 其他编辑器、临时脚本demo:使用VS Code、记事本写脚本,或者只想跑一段临时测试demo,不想完整新建一个PyCharm工程,直接在当前目录创建venv即可。
  5. CI/CD自动化流水线:流水线机器没有人工操作IDE的机会,全部靠脚本执行venv创建、依赖安装、执行用例。

二、真实工作场景

假如组长给你两个项目:一个是老接口的回归测试脚本(用的 pytest 7),一个是新接口的自动化(要用 pytest 8 的新特性)。

场景A:只会PyCharm新建Project的做法 你需要复制两份完整代码,新建两个独立PyCharm项目,各自生成venv,一个装pytest7,一个装pytest8。两份代码同步修改维护很麻烦,改一处要改两份,极易出错。

场景B:掌握手动venv命令的做法 只保留一份原始代码,在项目目录下分别创建 venv7、venv8 两套虚拟环境,一套安装pytest7.4.4,一套安装pytest8.2.0。PyCharm/VS Code只切换解释器,就可以分别跑两套环境的用例,代码只维护一份。

CI/CD 流水线(后面会讲)也是这个逻辑:每次构建都新建一个干净 venv,按requirements.txt装包再跑测试即可。

还有一类高频场景:同事把自动化脚本压缩包发给你,没有带venv。你解压代码,不能直接双击新建PyCharm项目覆盖源码。正确流程:

  1. 解压源码到本地文件夹;
  2. 命令行cd进入项目目录;
  3. 手动执行python -m venv .venv创建虚拟环境;
  4. 激活环境,再执行pip install -r requirements.txt;
  5. 使用编辑器打开现有文件夹,选择刚刚建好的venv解释器,直接运行脚本。

你还会遇到公司内网装包慢的情况。激活 venv 后,可以临时换个国内镜像源:

(venv) C:\test_auto> pip install requests -i [https://pypi.tuna.tsinghua.edu.cn/simple](https://pypi.tuna.tsinghua.edu.cn/simple)

三、避坑经验

  • 忘了激活就装包:最常见。你以为装好了,其实装进了系统 Python,一跑项目还是ModuleNotFoundError: No module named 'pytest'。每次开干前先瞄一眼命令行有没有(venv),没有就先 activate。
  • 把 venv 文件夹提交到 git:千万别。venv 里几千个文件,都是机器生成的,每个同事电脑上重建一份就行。在项目根目录建个.gitignore,写一行venv/、.venv/把它排除掉。(即通过.gitignore告诉 git:不要把.venv上传远程仓库)可以提交业务代码 +requirements.txt(记录依赖)。
  • 用错 python 命令:mac/Linux 上建环境要用python3 -m venv venv,如果写成python(指向系统旧的 2.x)会直接报错。看清当前默认是 python 还是 python3。
  • 激活了 pip 还是装到全局:少数情况系统有多个 Python,激活后pip仍指向别处。用python -m pip install xxx代替裸pip,强制用当前 venv 里的 Python 去调 pip,最稳。
  • 删环境舍不得:venv 文件夹可以直接整个删掉重来,不用「卸载」。它本来就是一次性的临时房间,坏了就删掉文件夹再建一个,零成本。

下篇预告

环境干净了,下一步得学 Python 本身了。下一篇讲「变量、数据类型与字符串」:测试里 80% 的活儿,靠这几个概念就够用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询