当前位置: 首页 > news >正文

python 为什么推荐使用虚拟环境(如 venv)?它解决了什么问题?

简单来说,虚拟环境(Virtual Environment)是一个独立的、隔离的 Python 运行环境。

我们可以把它想象成一个“项目专属工具箱”。你正在盖一栋房子(项目A),需要特定型号的螺丝刀和锤子(依赖库版本)。然后你又要去修一辆车(项目B),需要另一套完全不同的工具。你肯定不希望把所有工具都混在一个大箱子里,那样会造成混乱和冲突。虚拟环境就是为你的每个项目(房子、车)创建一个专属的、干净的工具箱。


虚拟环境解决了什么核心问题?

不使用虚拟环境,你所有的第三方包都会被安装到 Python 的全局 site-packages 目录中。这会导致以下几个严重的问题:

1. 依赖冲突(Dependency Hell - 依赖地狱)

这是最主要、最常见的问题。

场景:

  • 项目 A 是一个比较老的项目,它依赖于 Django==2.2
  • 你现在要开始一个新项目 B,想使用最新的 Django==4.0

如果不使用虚拟环境:

  1. 你为项目 A 安装了 Django 2.2:pip install Django==2.2
  2. 现在你为项目 B 安装 Django 4.0:pip install Django==4.0。这个命令会覆盖全局环境中已经安装的 Django 2.2。
  3. 当你再回到项目 A 并尝试运行时,它会因为 Django 版本不兼容(从 2.2 升级到 4.0 有很多重大改变)而崩溃

使用虚拟环境的解决方案:

  1. 为项目 A 创建一个虚拟环境 venv_a,激活它,然后安装 pip install Django==2.2
  2. 为项目 B 创建另一个虚拟环境 venv_b,激活它,然后安装 pip install Django==4.0

这两个环境是完全隔离的。venv_a 里是 Django 2.2,venv_b 里是 Django 4.0,它们互不干扰。你可以随时在两个项目间切换,只需要激活对应的虚拟环境即可。

2. 项目依赖不清晰,难以复现

场景:
你的全局环境里安装了几十个包,是过去几年为各种不同项目、实验、教程安装的。现在你要把你的项目交给同事,或者部署到服务器上。

如果不使用虚拟环境:

  • 你无法确切知道这个项目到底需要哪几个包。
  • 如果你执行 pip freeze > requirements.txt,它会把你全局环境中所有的包(几十上百个)都列出来,而你的项目可能只需要其中的 5 个。
  • 这会导致:
    • 部署困难:在服务器上安装了一大堆不必要的包,浪费空间和时间。
    • 协作困难:你的同事也不知道哪些是真正需要的。
    • 潜在冲突:某个你本地有但项目不需要的包,可能会在服务器上与其他软件产生冲突。

使用虚拟环境的解决方案:
在一个干净的虚拟环境中,你只安装该项目需要的包。这时运行 pip freeze > requirements.txt,生成的文件会非常干净、精确,只包含项目真正的依赖。任何人拿到这个 requirements.txt 文件,都可以创建一个新的虚拟环境,并用 pip install -r requirements.txt 命令完美复制你的开发环境。

3. 避免污染全局/系统 Python 环境

很多操作系统(特别是 Linux 和 macOS)会自带一个“系统 Python”,并用它来运行一些系统脚本。如果你随意修改全局环境的包(尤其是用 sudo pip install),可能会意外升级或卸载了某个系统脚本依赖的包,从而导致系统工具失常甚至崩溃

虚拟环境让你的所有操作都限制在项目目录内的一个文件夹里,完全不会影响到系统级的 Python 环境,非常安全。

4. 便于管理不同 Python 版本的项目

虽然 venv 主要用于管理包,但结合 pyenv 这类工具,你可以为项目 A 指定 Python 3.7 环境,为项目 B 指定 Python 3.10 环境,每个环境再有自己独立的包。这对于需要维护兼容旧版 Python 的项目来说至关重要。


如何使用 venv(Python 3.3+ 自带)

venv 是目前官方推荐的标准库。使用起来非常简单:

1. 创建虚拟环境
在你的项目根目录下,运行:

# 'venv' 是你给这个虚拟环境文件夹起的名字,可以自定义,但 'venv' 是一个普遍的约定
python -m venv venv 

执行后,项目里会多出一个 venv 文件夹,里面包含了 Python 解释器的副本和相关工具。

2. 激活虚拟环境

  • 在 Windows 上:
    .\venv\Scripts\activate
    
  • 在 macOS / Linux 上:
    source venv/bin/activate
    

激活后,你会发现你的命令行提示符前面多了 (venv) 的字样,表示你现在正处于这个虚拟环境中。

3. 在虚拟环境里工作
现在,你所有的 pippython 命令都将作用于这个隔离的环境中。

(venv) $ pip install requests
(venv) $ python my_app.py

4. 生成依赖文件
完成项目开发或安装完所有依赖后,锁定版本:

(venv) $ pip freeze > requirements.txt

5. 退出虚拟环境
当你需要离开这个环境时,运行:

(venv) $ deactivate

命令行提示符会恢复原样。

总结

问题无虚拟环境的后果使用虚拟环境的优势
依赖管理所有项目共享全局包,版本冲突导致项目崩溃。每个项目拥有独立的包,互不干扰。
项目复现requirements.txt 混乱,包含大量无关包,难以复现。requirements.txt 精确、干净,可轻松在任何地方重建环境。
系统安全可能污染系统 Python,导致系统工具损坏。完全不影响全局或系统环境,非常安全。
整洁性全局环境臃肿不堪,难以管理。项目依赖清晰明了,易于维护。

因此,为每个 Python 项目创建一个虚拟环境,是 Python 开发中最重要、最基本的实践之一。它不是一个“可选”的高级技巧,而是一个从第一天开始就应该养成的习惯。

http://www.dtcms.com/a/271174.html

相关文章:

  • doris2.1.8连接报错ERROR 1203 (42000): Reach limit of connections解决办法
  • 使用 Docker Compose 简化 INFINI Console 与 Easysearch 环境搭建
  • Oracle:使用ONLINE选项创建索引
  • 【内核基础精讲】I2C 子系统核心概念与结构全解析
  • 类与对象【下篇】-- 关于类的其它语法
  • 蓝凌EKP产品:属性转换器系统优化
  • c语言学习_函数递归2
  • 70、【OS】【Nuttx】【构建】配置 stm32 工程
  • STM32继电器万能控制设备
  • 【04】MFC入门到精通——MFC 自己手动新添加对话框模板 并 创建对话框类
  • SpringBoot集成文件 - 大文件的上传(异步,分片,断点续传和秒传)
  • 数据结构基础准备:包装类 泛型 泛型的上界 密封类
  • 零知开源——STM32F407VET6驱动SHT41温湿度传感器完整教程
  • 2023年全国青少年信息素养大赛Python编程小学组复赛真题+答案解析-北京赛区
  • idea 常用快捷键
  • Mysql中的日志-undo/redo/binlog详解
  • 学习open62541 --- [79] 在docker中运行open62541工程
  • pytorch chunk 切块
  • 【C++】容器适配器 + stack/queue/deque详解
  • Java基础,反射破坏封装性 - 单例模式的崩塌
  • 掌握PDF转CAD技巧,提升工程设计效率
  • 第四节 chatPDF
  • 机器视觉之工业相机讲解
  • unity animtor播放动画的指定位置
  • spring boot使用mybatis-plus实现分页功能
  • C++学习笔记三
  • MATLAB基于voronoi生成三维圆柱形
  • Token 和 Embedding的关系
  • 基于AOP+Redis的简易滑动窗口限流
  • C#基础篇(10)集合类之列表