Python中虚拟环境venv创建和使用教学

 更新时间:2026年09月17日 11:49:08   作者:程序员食堂  
venv是 Python 标准库自带的虚拟环境(virtual environment)模块,从 Python 3.3 起内置,用于创建隔离的 Python 运行环境,下面我们就来看看venv创建和使用的具体内容吧

一、什么是 venv

venv 是 Python 标准库自带的虚拟环境(virtual environment)模块,从 Python 3.3 起内置,用于创建隔离的 Python 运行环境。

一个虚拟环境本质上是一个目录,里面包含:

  • 一套独立的 Python 解释器(python.exe / python)
  • 独立的包管理工具(pip)
  • 独立的第三方包安装目录(site-packages)
  • 激活脚本(activate / activate.bat / Activate.ps1)
  • 配置文件 pyvenv.cfg

它不是一个沙箱或容器,而是通过路径重定向实现的轻量级隔离。

二、目录结构

以 Windows 下 backend\venv 为例:

backend\venv\
├── Scripts\
│   ├── python.exe          # 该环境的 Python 解释器
│   ├── pip.exe             # 该环境的 pip
│   ├── activate.bat        # CMD 激活脚本
│   ├── Activate.ps1        # PowerShell 激活脚本
│   ├── uvicorn.exe         # 已安装的命令行工具
│   └── ...
├── Lib\
│   └── site-packages\      # 该环境专属的第三方包
├── Include\                # C 扩展头文件
└── pyvenv.cfg              # 关键配置:记录创建时的 Python 路径与版本

Linux / macOS 下对应结构为:

venv/
├── bin/
│   ├── python
│   ├── pip
│   ├── activate
│   └── ...
├── lib/
│   └── python3.x/
│       └── site-packages/
└── pyvenv.cfg

三、核心机制

1. 创建

python -m venv venv

执行后,Python 会:

  • 在目标目录生成一套解释器入口(Windows 上是真实的 python.exe 副本,Linux 上通常是指向系统解释器的符号链接)。
  • 写入 pyvenv.cfg,记录创建它的基础 Python 的路径和版本。
  • 安装一份独立的 pip。

2. pyvenv.cfg

这是虚拟环境的“身份证”,例如:

home = C:\Python314
include-system-site-packages = false
version = 3.14.x
  • home:创建它的基础 Python 所在目录。
  • version:基础 Python 版本。
  • include-system-site-packages:是否允许访问全局 site-packages,默认 false。

虚拟环境与创建它的 Python 版本永久绑定,这是关键特性。

3. 激活

# Windows CMD
venv\Scripts\activate.bat

# Windows PowerShell
venv\Scripts\Activate.ps1

# Linux / macOS
source venv/bin/activate

激活的本质是修改当前 shell 的 PATH,把 venv/Scripts(或 venv/bin)排到最前面。此后:

  • python → 指向虚拟环境里的解释器
  • pip → 指向虚拟环境里的 pip
  • 安装的包 → 进入虚拟环境的 site-packages

激活只在当前 shell 会话生效,关闭终端即失效。

4. 退出

deactivate

恢复原来的 PATH。

四、为什么需要 venv

1. 依赖隔离

不同项目可能依赖同一包的不同版本:

项目依赖
项目 Afastapi==0.100
项目 Bfastapi==0.115

若全部装在全局 Python 中,必然冲突。虚拟环境让每个项目拥有独立的依赖集合。

2. 避免污染全局环境

实验性、一次性、版本敏感的包不会影响系统 Python,降低“装崩全局环境”的风险。

3. 便于复现

配合 requirements.txt 或 pyproject.toml,可在任意机器上重建一致环境:

pip install -r requirements.txt

4. 权限友好

在 Linux 上无需 sudo 即可安装包。

五、常见误区

误区 1:激活 venv 后,PATH 里的 Python 版本仍生效

错。 激活后,python 命令解析到虚拟环境里的解释器,与系统 PATH 中的 Python 无关。

误区 2:系统显示 Python 3.11,项目用的就是 3.11

错。 若 venv 是用 3.14 创建的,激活后实际运行的是 3.14。判断依据是 pyvenv.cfg 里的 version,而非系统 python --version。

误区 3:venv 是沙箱,能隔离系统资源

错。 venv 只隔离 Python 包,不隔离文件系统、网络、进程。需要更强隔离应使用 Docker、conda、virtualenv(功能更全)等。

误区 4:venv 可以随意换 Python 版本

错。 venv 与创建它的 Python 版本绑定。要换版本,必须删除重建:

rm -rf venv          # Linux / macOS
rmdir /s /q venv     # Windows
python -m venv venv  # 用新版本重建

六、典型问题案例

现象

脚本运行后报错:

Python reports SOABI: cp314-win_amd64
...
ModuleNotFoundError: No module named 'loguru'

但用户在命令行查看 python --version 显示 3.11.9。

原因

  • backend\venv 是之前用 Python 3.14 创建的。
  • 脚本检测到 venv 已存在,跳过创建,直接 activate。
  • 激活后 pip install -r requirements.txt 使用 3.14 安装依赖。
  • 部分包(如 pydantic-core)在 3.14 下无预编译 wheel,pip 回退到源码构建,需要 Rust 工具链,网络失败导致安装中断。
  • loguru 等包实际未装上。
  • 启动 uvicorn 时立即 ModuleNotFoundError。

解决

删除 venv,用 3.11.9 重建:

rmdir /s /q backend\venv
python -m venv backend\venv
backend\venv\Scripts\activate.bat
pip install -r backend\requirements.txt

七、venv 与其他方案对比

方案隔离级别能否管理 Python 版本是否需额外安装
venv包级否否(标准库)
virtualenv包级否是
conda包级 + 环境级是是
pipenv包级否是
poetry包级否是
Docker系统级是是

选择建议:

  • 纯 Python 项目、依赖不复杂 → venv 足够。
  • 需要管理多个 Python 版本或科学计算栈 → conda。
  • 需要完整环境复现、部署一致性 → Docker。

八、最佳实践

每个项目一个 venv,放在项目根目录,命名为 venv 或 .venv。

将 venv 加入 .gitignore,绝不提交到版本控制。

用 requirements.txt 或 pyproject.toml 锁定依赖版本,保证可复现。

换 Python 版本时删除重建 venv,不要试图复用。

CI/CD 中显式指定 Python 版本,避免本地与流水线不一致。

判断 venv 实际版本看 pyvenv.cfg,不要只看系统 python --version。

激活后确认解释器路径:

where python     # Windows
which python     # Linux / macOS

应指向 venv 内部。

九、一句话总结

venv 是 Python 内置的轻量级依赖隔离工具,通过独立的解释器入口、site-packages 和 pyvenv.cfg 实现项目级环境隔离;它与创建时的 Python 版本永久绑定,换版本必须删除重建,激活后系统 PATH 中的 Python 版本不再生效。

以上就是Python中虚拟环境venv创建和使用教学的详细内容,更多关于Python虚拟环境venv的资料请关注脚本之家其它相关文章!

相关文章

  • pyqt6的本地环境部署(conda和vscode环境)

    pyqt6的本地环境部署(conda和vscode环境)

    本文主要介绍了pyqt6的本地环境部署(conda和vscode环境),文中通过示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-05-05
  • 基于Python实现简易的单词记忆软件

    基于Python实现简易的单词记忆软件

    这篇文章主要为大家详细介绍了如何基于Python实现一个简易的单词记忆软件,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-07-07
  • Python中使用Boolean操作符做真值测试实例

    Python中使用Boolean操作符做真值测试实例

    这篇文章主要介绍了Python中使用Boolean操作符做真值测试实例,在Python中,任何类型的对象都可以做真值测试,并且保证返回True或者False,需要的朋友可以参考下
    2015-01-01
  • Python 批量验证和添加手机号码为企业微信联系人

    Python 批量验证和添加手机号码为企业微信联系人

    你是否也有过需要添加很多微信好友的时候,一个个输入添加太麻烦了,本篇文章手把手教你用Python替我们完成这繁琐的操作,大家可以在过程中查缺补漏,看看自己掌握程度怎么样
    2021-10-10
  • Python快速实现一键抠图功能的全过程

    Python快速实现一键抠图功能的全过程

    你有没想过,Python也能成为这样的一种工具:在只有一张图片,需要细致地抠出人物的情况下,能帮你减少抠图步骤,这篇文章主要给大家介绍了关于Python快速实现一键抠图功能的相关资料,需要的朋友可以参考下
    2021-06-06
  • 全面解读Python Web开发框架Django

    全面解读Python Web开发框架Django

    Django是一个开源的Web应用框架,由Python写成。采用MVC的软件设计模式,主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django注重组件的重用性和“可插拔性”,敏捷开发和DRY法则(Don’t Repeat Yoursef)。
    2014-06-06
  • python使用requests POST提交一个键多个值方式

    python使用requests POST提交一个键多个值方式

    这篇文章主要介绍了python使用requests POST提交一个键多个值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Python各类图像库的图片读写方式总结(推荐)

    Python各类图像库的图片读写方式总结(推荐)

    这篇文章主要介绍了Python各类图像库的图片读写方式总结(推荐),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • python 爬虫请求模块requests详解

    python 爬虫请求模块requests详解

    这篇文章主要介绍了python 爬虫请求模块requests详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Python 中的反转字符串reversed(),切片

    Python 中的反转字符串reversed(),切片

    这篇文章主要介绍了Python 中的反转字符串reversed(),切片 ,以相反的顺序反转和处理字符串可能是编程中的一项常见任务。Python 提供了一组工具和技术,可以帮助我们快速有效地执行字符串反转,下面来看看具体内容吧
    2021-12-12

最新评论