相信很多人都有这样的经历,在使用python时,安装了一个依赖包,结果导致另一个项目报错。这就是依赖隔离没有做好,其中python venv是官方推荐的、最标准的项目依赖隔离方案。今天我们就来看看venv,它是什么,为什么要用,如何用。在没有使用虚拟环境时,我们用pip install 安装所有的依赖包,都直接进入系统级的Python环境,也就是所有项目共享一个依赖库。但是在很多 场景下就会出问题,例如项目A要reqeust的2.28版,而B需要request 2.32版,项目C需要urllib3 版本和项目A冲突,这就导致各种问题。因此也是虚拟环境存在的意义。在2012年,PEP 405提案出台,正式定义了Python虚拟环境的实现规范。它的设计思路很简单,每个虚拟环境都有自己的根目录,独立的包路径,以及一个配置文件,告诉Python解释器它处于隔离环境。这个关键的配置文件就是pyvenv.cfg,有了它就能区分什么时候当前环境是虚拟环境的包,什么时候用的是系统base解释器的包。接下来我们看看Python venv的用法,创建虚拟环境只需要一行命令# 1. 指定具体 Python 版本(比如 3.12)python3.12 -m venv .venv# 2. Windows 系统专属写法(指定 3.12 版本)py -3.12 -m venv .venv# 3. 创建不含 pip 的虚拟环境(特殊需求用)python -m venv .venv --without-pip# 4. 若环境已存在,彻底重建(覆盖原有依赖)python -m venv .venv --clear
很多人觉得venv很神奇,其实它的逻辑很简单,运行python -m venv .venv时,python会执行4个核心的步骤:创建虚拟环境的文件夹结构(就是你看到的 .venv 目录);
生成 pyvenv.cfg 配置文件,记录 base 解释器的元数据;
在虚拟环境内部,配置专属的 Python 可执行文件;
安装 pip(除非用 --without-pip 禁用)。
那么要如何来判断自己是否处于虚拟环境中呢?其实可以通过代码来判断import sys# 判断是否在虚拟环境中in_venv = sys.prefix != sys.base_prefixprint("是否在虚拟环境中:", in_venv)print("当前环境路径:", sys.prefix)print("系统 base 环境路径:", sys.base_prefix)
是不是很简单?另外一个问题,虚拟环境一定要激活吗?答案是不是必须的,但通常我们会激活来使用,因为这样更方便。如果不激活可以直接指定.venv中的python路径# 非激活状态运行脚本(Mac/Linux).venv/bin/python script.py# 非激活状态运行脚本(Windows).venv\Scripts\python.exe script.py
特别是在CI/CD脚本中,直接使用绝对路径,反而比激活环境更稳定、更不容易出错。总之,搞懂venv,就已经超过了很多的新手,做好依赖管理,避免项目间的冲突,不妨动手试试。