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

【Python-Day 43】告别依赖混乱:Python虚拟环境venv入门与实战

Langchain系列文章目录

01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南
02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖
03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南
04-玩转 LangChain:从文档加载到高效问答系统构建的全程实战
05-玩转 LangChain:深度评估问答系统的三种高效方法(示例生成、手动评估与LLM辅助评估)
06-从 0 到 1 掌握 LangChain Agents:自定义工具 + LLM 打造智能工作流!
07-【深度解析】从GPT-1到GPT-4:ChatGPT背后的核心原理全揭秘
08-【万字长文】MCP深度解析:打通AI与世界的“USB-C”,模型上下文协议原理、实践与未来

Python系列文章目录

PyTorch系列文章目录

机器学习系列文章目录

深度学习系列文章目录

Java系列文章目录

JavaScript系列文章目录

Python系列文章目录

01-【Python-Day 1】告别编程恐惧:轻松掌握 Python 安装与第一个程序的 6 个步骤
02-【Python-Day 2】掌握Python基石:变量、内存、标识符及int/float/bool数据类型
03-【Python-Day 3】玩转文本:字符串(String)基础操作详解 (上)
04-【Python-Day 4】玩转文本:Python 字符串常用方法深度解析 (下篇)
05-【Python-Day 5】Python 格式化输出实战:%、format()、f-string 对比与最佳实践
06- 【Python-Day 6】从零精通 Python 运算符(上):算术、赋值与比较运算全解析
07-【Python-Day 7】从零精通 Python 运算符(下):逻辑、成员、身份运算与优先级规则全解析
08-【Python-Day 8】从入门到精通:Python 条件判断 if-elif-else 语句全解析
09-【Python-Day 9】掌握循环利器:for 循环遍历序列与可迭代对象详解
10-【Python-Day 10】Python 循环控制流:while 循环详解与 for 循环对比
11-【Python-Day 11】列表入门:Python 中最灵活的数据容器 (创建、索引、切片)
12-【Python-Day 12】Python列表进阶:玩转添加、删除、排序与列表推导式
13-【Python-Day 13】Python 元组 (Tuple) 详解:从创建、操作到高级应用场景一网打尽
14-【Python-Day 14】玩转Python字典(上篇):从零开始学习创建、访问与操作
15-【Python-Day 15】深入探索 Python 字典 (下):常用方法、遍历、推导式与嵌套实战
16-【Python-Day 16】代码复用基石:详解 Python 函数的定义与调用
17-【Python-Day 17】玩转函数参数(上):轻松掌握位置、关键字和默认值
18-【Python-Day 18】玩转函数参数(下):*args 与 **kwargs 终极指南
19-【Python-Day 19】函数的回响:深入理解 return 语句与返回值
20-【Python-Day 20】揭秘Python变量作用域:LEGB规则与global/nonlocal关键字详解
21-【Python-Day 21】一行搞定!Python lambda 匿名函数的妙用与实战
22-【Python-Day 22】代码的基石:模块(Module)的导入与使用详解
23-【Python-Day 23】Python 模块化编程实战:创建、导入及 sys.path 深度解析
24-【Python-Day 24】告别杂乱代码!一文掌握 Python 包(Package)的创建与使用
25-【Python-Day 25】玩转数字:精通 math 与 random 模块,从数学运算到随机抽样
26-【Python-Day 26】解锁时间魔法:深入解析 time 与 datetime 模块
27-【Python-Day 27】轻松驾驭操作系统:精通 os 与 sys 模块核心功能
28-【Python-Day 28】从指令到蓝图:Python面向对象编程(OOP)入门指南
29-【Python-Day 29】万物皆对象:详解 Python 类的定义、实例化与 __init__ 方法
30-【Python-Day 30】从 self、cls 到 @staticmethod:Python 面向对象三大方法深度解析
31-【Python-Day 31】一文搞懂 Python 实例属性与类属性:从定义、区别到应用场景
32-【Python-Day 32】面向对象基石之封装:从 __private@property 的深度解析
33-【Python-Day 33】OOP核心之继承(Inheritance):代码复用与扩展的艺术
34-【Python-Day 34】深入解析Python继承:super()函数、MRO与菱形继承问题
35-【Python-Day 35】深入理解多态:代码更灵活的“鸭子类型”魔法
36-【Python-Day 36】解密文件IO:一文搞懂 Python 读写模式、编码与指针操作
37-【Python-Day 37】程序的守护者:一文彻底搞懂 Python 异常处理 (try-except-else-finally)
38-【Python-Day 38】告别通用错误!一文学会创建和使用 Python 自定义异常
39-【Python-Day 39】精通Python推导式:告别冗长for循环,提升代码效率与格调
40-【Python-Day 40】告别内存溢出!Python 生成器 (Generator) 的原理与实战
41-【Python-Day 41】揭秘函数的“魔法外衣”:一文彻底搞懂 Python 装饰器 (Decorator)
42-【Python-Day 42】解锁文本处理神技:Python 正则表达式 (Regex) 从入门到实战
43-【Python-Day 43】告别依赖混乱:Python虚拟环境venv入门与实战


文章目录

  • Langchain系列文章目录
  • Python系列文章目录
  • PyTorch系列文章目录
  • 机器学习系列文章目录
  • 深度学习系列文章目录
  • Java系列文章目录
  • JavaScript系列文章目录
  • Python系列文章目录
  • 摘要
  • 一、为什么需要虚拟环境?
    • 1.1 “依赖地狱”的困境
    • 1.2 虚拟环境:项目的“专属书房”
    • 1.3 可视化理解
  • 二、Python 内置的虚拟环境工具:`venv`
    • 2.1 创建虚拟环境
    • 2.2 激活虚拟环境
        • (1) 在 Windows 上 (CMD / PowerShell)
        • (2) 在 macOS / Linux 上 (bash / zsh)
    • 2.3 在虚拟环境中使用 `pip`
        • (1) 查看已安装的包
        • (2) 安装包
    • 2.4 退出虚拟环境
  • 三、虚拟环境实战与最佳实践
    • 3.1 结合 `requirements.txt` 进行依赖管理
        • (1) 生成依赖列表
        • (2) 从文件安装依赖
    • 3.2 常见问题与注意事项
        • (1) `venv` 文件夹应该提交到 Git 吗?
        • (2) 如何在 IDE (如 VS Code, PyCharm) 中使用虚拟环境?
        • (3) 我忘记激活环境,把包安装到全局了怎么办?
  • 四、总结


摘要

在 Python 开发中,管理项目依赖是一个至关重要的环节。想象一下,你同时在开发两个项目:项目A需要 requests 库的 2.20 版本,而项目B却依赖最新的 2.28 版本。如果将它们都安装在全局环境中,势必会引发版本冲突,导致其中一个项目无法正常运行。这就是所谓的“依赖地狱”。为了解决这个问题,Python 提供了虚拟环境(Virtual Environment)这一强大工具。本文将深入浅出地讲解为什么需要虚拟环境,并手把手教你如何使用 Python 3 内置的 venv 模块来创建、管理和使用虚拟环境,让你从此告别依赖混乱,享受纯净、隔离的开发体验。

一、为什么需要虚拟环境?

在深入学习如何操作之前,我们必须先理解其背后的动机。这能帮助我们更好地掌握这项技术,并认识到它的重要性。

1.1 “依赖地狱”的困境

让我们用一个生活中的类比来理解。

想象一下,你的电脑是你的家,全局的 Python 环境就像家里唯一的一个大书架。你所有的项目(比如“烹饪”项目、“编程”项目)都需要从这个书架上拿书(Python包/库)。

  • “烹饪”项目:需要一本《经典川菜》第1版。
  • “新式融合菜”项目:需要一本《经典川菜》第2版(内容有更新)。

问题来了:这个公共书架上只能放一本书叫《经典川菜》。如果你放了第1版,那么“新式融合菜”项目就无法进行;如果你放了第2版,“烹饪”项目可能就会出错,因为菜谱变了。这种因为共享资源而产生的冲突,就是“依赖地狱”。

在 Python 开发中,这个“书”就是第三方库(如 Django, requests, pandas 等),“版本”就是库的版本号。全局环境只有一个,安装了新版本的库会覆盖旧版本,从而导致依赖旧版本的项目崩溃。

1.2 虚拟环境:项目的“专属书房”

虚拟环境的出现,就是为了解决上述问题。它就像是为你的每个项目都创建一个独立的、带锁的“专属书房”。

  • 每个“书房”里都有自己独立的书架(独立的 site-packages 目录)。
  • 你可以在“烹饪”项目的书房里,放心地放上《经典川菜》第1版。
  • 同时,在“新式融合菜”项目的书房里,放上《经典川菜》第2版。
  • 两个书房互不干扰,完美解决了版本冲突问题。

总结来说,虚拟环境的核心价值在于:

  1. 依赖隔离 (Isolation): 每个项目拥有自己独立的 Python 解释器副本和第三方库集合,互不影响。
  2. 环境纯净 (Cleanliness): 新创建的虚拟环境是一个干净的状态,只包含最基础的工具(如pip),你可以按需安装,避免全局环境中大量无关包的干扰。
  3. 便于协作与部署 (Collaboration & Deployment): 你可以轻松地将项目所需的确切依赖列表(requirements.txt)分享给同事,或者在服务器上精确复制生产环境,确保代码在任何地方都能以预期方式运行。

1.3 可视化理解

使用 Mermaid 流程图可以更直观地展示全局环境与虚拟环境的区别:

graph TDsubgraph 全局Python环境 (像一个公共大书架)G_Python[Python 解释器]G_Lib[全局site-packages]G_Lib --> P1_req_v1(requests==2.20.0)G_Lib --> P2_req_v2(pandas==1.5.0)endsubgraph 虚拟环境 (为每个项目创建专属书房)subgraph 项目A环境 (venv_A)A_Python[Python 解释器副本]A_Lib[独立的 site-packages]A_Lib --> A_req(requests==2.20.0)endsubgraph 项目B环境 (venv_B)B_Python[Python 解释器副本]B_Lib[独立的 site-packages]B_Lib --> B_req1(requests==2.28.1)B_Lib --> B_req2(pandas==2.0.3)endendstyle P1_req_v1 fill:#f9f,stroke:#333,stroke-width:2pxstyle B_req1 fill:#f9f,stroke:#333,stroke-width:2pxlinkStyle 0 stroke-width:2px,fill:none,stroke:red;linkStyle 1 stroke-width:2px,fill:none,stroke:red;note P1_req_v1,B_req1 "版本冲突点"

从上图可见,如果项目A和项目B都使用全局环境,requests 库的版本就会产生冲突。而使用虚拟环境,每个项目都有自己的库,问题迎刃而解。

二、Python 内置的虚拟环境工具:venv

从 Python 3.3 版本开始,官方推荐使用内置的 venv 模块来管理虚拟环境。它简单、方便,无需安装任何额外工具。

2.1 创建虚拟环境

创建虚拟环境非常简单,只需要一条命令。首先,通过命令行进入你的项目文件夹(这是一个好习惯),然后执行以下命令:

# 语法: python -m venv <虚拟环境名称>
# 推荐的名称是 "venv" 或 ".venv"
python -m venv venv

命令解析:

  • python -m venv: 表示我们要使用 python 解释器来运行 venv 模块。
  • venv: 这是我们给虚拟环境起的名字。执行命令后,你会在当前目录下看到一个名为 venv 的新文件夹。

这个 venv 文件夹里包含了什么?

  • Scripts (在 Windows 上) 或 bin (在 macOS/Linux 上): 包含一个独立的 Python 解释器副本、pip 工具以及激活环境的脚本。
  • Lib/site-packages (在 Windows 上) 或 lib/pythonX.X/site-packages (在 macOS/Linux 上): 这就是项目的“专属书架”,之后安装的所有第三方库都会放在这里。
  • pyvenv.cfg: 一个配置文件,用于指明该虚拟环境关联的全局 Python 解释器路径。

2.2 激活虚拟环境

创建好环境后,它并不会自动生效,你需要“激活”它,也就是走进这个“专属书房”。

(1) 在 Windows 上 (CMD / PowerShell)
# 进入 venv 文件夹下的 Scripts 目录,并执行 activate 脚本
.\venv\Scripts\activate

激活成功后,你会发现你的命令行提示符前面多了一个 (venv) 的前缀,像这样:

(venv) C:\path\to\your\project>

这个前缀明确地告诉你:当前你正处于 venv 这个虚拟环境中,之后所有的 pythonpip 命令都将在此环境下执行。

(2) 在 macOS / Linux 上 (bash / zsh)
# 使用 source 命令执行 venv/bin 目录下的 activate 脚本
source venv/bin/activate

同样,激活成功后,命令行提示符会显示 (venv) 前缀:

(venv) user@hostname:~/path/to/your/project$

2.3 在虚拟环境中使用 pip

激活环境后,我们可以来验证一下它的隔离性。

(1) 查看已安装的包
# 在激活的环境中执行
pip list

你会看到输出列表非常干净,通常只有 pipsetuptools 等基础包。这证明了我们的“书架”是空的。

(2) 安装包

现在,让我们为这个项目安装一个特定版本的 requests 库。

# 确保你处于 (venv) 激活状态下
pip install requests==2.25.1

安装完成后,再次运行 pip list,你会看到 requests 及其依赖项已经成功安装到了这个虚拟环境中。

(venv) C:\path\to\your\project> pip list
Package         Version
--------------- --------
certifi         2023.7.22
charset-normalizer 3.3.2
idna            3.6
pip             23.3.1
requests        2.25.1  <-- 看这里!
setuptools      68.2.2
urllib3         1.26.18

此时,如果你退出虚拟环境,在全局环境中运行 pip list,是看不到 requests==2.25.1 的(除非你全局也安装过)。这就完美实现了隔离。

2.4 退出虚拟环境

当你完成了在这个项目上的工作,想要回到全局环境时,只需执行一个简单的命令:

deactivate

执行后,命令行提示符前面的 (venv) 前缀会消失,一切恢复原样。你已经从“专属书房”里走出来了。

三、虚拟环境实战与最佳实践

掌握了基本操作后,让我们看看在真实项目中如何更高效地使用虚拟环境。

3.1 结合 requirements.txt 进行依赖管理

当你需要和他人协作,或者将项目部署到服务器时,直接拷贝 venv 文件夹是不可行的(它可能非常大,并且包含与特定操作系统相关的链接)。正确的做法是使用 requirements.txt 文件来管理和同步依赖。

(1) 生成依赖列表

在你的项目开发过程中,当你安装了所有必需的包之后,可以在已激活的虚拟环境中运行以下命令,将当前环境中的所有包及其精确版本号导出到一个名为 requirements.txt 的文件中。

# 确保 (venv) 已激活
pip freeze > requirements.txt

执行后,项目根目录下会多出一个 requirements.txt 文件,内容类似:

certifi==2023.7.22
charset-normalizer==3.3.2
idna==3.6
requests==2.25.1
urllib3==1.26.18
(2) 从文件安装依赖

当你的同事获取到你的项目代码(包含了 requirements.txt 文件)后,他们只需:

  1. 创建并激活自己的虚拟环境。
  2. 运行以下命令,pip 就会自动读取文件内容,并安装所有指定的包和版本。
# 确保在新创建的 (venv) 环境中
pip install -r requirements.txt

这个流程确保了所有开发者的环境都能保持一致,极大地减少了“在我电脑上能跑”这类问题。

3.2 常见问题与注意事项

(1) venv 文件夹应该提交到 Git 吗?

绝对不要!

venv 文件夹应该被添加到项目的 .gitignore 文件中。原因如下:

  • 体积庞大:包含完整的解释器和所有库,会迅速撑爆你的代码仓库。
  • 平台相关:Windows 和 macOS/Linux 的 venv 结构不同,无法跨平台共享。
  • 可重现性requirements.txt 才是定义环境的唯一标准,venv 文件夹可以随时通过它重建。

在你的 .gitignore 文件中加入下面这行:

# .gitignore# Python virtual environment
venv/
.venv/
(2) 如何在 IDE (如 VS Code, PyCharm) 中使用虚拟环境?

现代 IDE 对 Python 虚拟环境的支持都非常好。

  • PyCharm: 在创建新项目时,它会默认提示你创建一个虚拟环境。对于现有项目,你可以在 Settings/Preferences > Project: [your_project_name] > Python Interpreter 中选择或添加位于 venv/Scripts/python.exe (Windows) 或 venv/bin/python (macOS/Linux) 的解释器。
  • VS Code: 当你打开一个包含 venv 文件夹的项目时,VS Code 通常会自动检测到它,并在右下角提示你选择此解释器。你也可以手动通过 Ctrl+Shift+P 打开命令面板,输入 Python: Select Interpreter 来选择虚拟环境中的解释器。

配置好后,IDE 内置的终端、代码运行和调试功能都会自动使用这个虚拟环境。

(3) 我忘记激活环境,把包安装到全局了怎么办?

这是一个常见错误。解决方法很简单:

  1. 在全局环境中(未激活任何虚拟环境的状态),卸载你误装的包:pip uninstall a_package_name
  2. 激活你的项目虚拟环境:source venv/bin/activate.\venv\Scripts\activate
  3. 在虚拟环境中重新安装包:pip install a_package_name

四、总结

掌握虚拟环境是每一位 Python 开发者从入门到进阶的必经之路。它虽然只是一个简单的工具,但其带来的项目整洁性和可维护性是无价的。

本文的核心要点可以概括为以下几点:

  1. 核心目的:虚拟环境通过创建隔离的 Python 运行环境,彻底解决了不同项目间的“依赖地狱”问题,保证了项目的纯净与稳定。
  2. 标准工具venv 是 Python 3.3+ 内置的官方推荐工具,轻量且无需额外安装。
  3. 核心工作流
    • 创建:python -m venv venv
    • 激活:Windows 用 .\venv\Scripts\activate,macOS/Linux 用 source venv/bin/activate
    • 使用:在激活的环境中正常使用 pip installpython 命令。
    • 退出:deactivate
  4. 协作与部署:使用 pip freeze > requirements.txt 导出依赖,使用 pip install -r requirements.txt 安装依赖,这是团队协作和项目部署的标准实践。
  5. 最佳实践:永远不要将 venv 文件夹提交到版本控制系统(如 Git),而是将其添加到 .gitignore 文件中。

从今天起,为你的每一个新项目都创建一个虚拟环境吧!这个小小的习惯将为你的 Python 开发之旅扫清许多障碍,让编码过程更加顺畅和专业。



文章转载自:

http://cm6ACusk.zyytn.cn
http://V2qqWWO5.zyytn.cn
http://HGj65O0d.zyytn.cn
http://yk5adDLB.zyytn.cn
http://VEan3Ls4.zyytn.cn
http://nE0kw2OA.zyytn.cn
http://w9W0ZeS4.zyytn.cn
http://NO07Azqh.zyytn.cn
http://2ljusdWl.zyytn.cn
http://JuXHc0OX.zyytn.cn
http://J2RxS5Eh.zyytn.cn
http://JrCSrlRB.zyytn.cn
http://lwpUI3tN.zyytn.cn
http://4gAZcMnh.zyytn.cn
http://MOA6EiWQ.zyytn.cn
http://iLB4MFTZ.zyytn.cn
http://twjlmr0W.zyytn.cn
http://ErhoHLWG.zyytn.cn
http://bEHc6jH0.zyytn.cn
http://zoxuFtai.zyytn.cn
http://5HLgo0If.zyytn.cn
http://wbHJrDOr.zyytn.cn
http://IEhffSs9.zyytn.cn
http://9dOcwX81.zyytn.cn
http://u0TWW7sd.zyytn.cn
http://bhdY2equ.zyytn.cn
http://nrnkpvJC.zyytn.cn
http://NNnPKPkP.zyytn.cn
http://6vvLMpAq.zyytn.cn
http://rjxN96qY.zyytn.cn
http://www.dtcms.com/a/378156.html

相关文章:

  • CF702E Analysis of Pathes in Functional Graph 题解
  • 元宇宙与智慧城市:数字孪生赋能的城市治理新范式
  • es通过分片迁移迁移解决磁盘不均匀问题
  • 深入浅出CRC校验:从数学原理到单周期硬件实现 (2)CRC数学多项式基础
  • 无人设备遥控器之控制指令发送技术篇
  • LinuxC++项目开发日志——高并发内存池(4-central cache框架开发)
  • 解决蓝牙耳机连win11电脑画质依托答辩问题
  • 农业养殖为何离不开温湿度传感器?
  • Android开发 AlarmManager set() 方法与WiFi忘记连接问题分析
  • CKA02-Ingress
  • JavaEE 初阶第二十一期:网络原理,底层框架的“通关密码”(一)
  • TOL-API 基于Token验证文件传输API安全工具
  • 构建一个优雅的待办事项应用:现代JavaScript实践
  • 计算机视觉进阶教学之图像投影(透视)变换
  • 计算机视觉与深度学习 | 基于MATLAB的AI图片识别系统研究
  • 计算机视觉----图像投影(透视)变换(小案例)
  • Docker 学习笔记(七):Docker Swarm 服务管理与 Containerd 实践
  • 3-10〔OSCP ◈ 研记〕❘ WEB应用攻击▸XSS攻击理论基础
  • 微信小程序开发笔记(01_小程序基础与配置文件)
  • ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 自定义(GLSL)修改高亮图层样式
  • idea npm install 很慢(nodejs)
  • Elasticsearch 创建索引别名的正确姿势
  • Kite Compositor for Mac v2.1.2 安装教程|DMG文件安装步骤(Mac用户必看)
  • 深入探索 Unity 错误排查过程:从“滚动条问题”到“鼠标悬浮异常”
  • 【设计模式】从游戏角度开始了解设计模式 --- 抽象工厂模式
  • 南京大学实现非线性光学新范式丨《Light》报道光电可调谐液晶二次谐波衍射研究
  • 【Java】Hibernate-5:Hibernate的一级缓存
  • 【C#】理解.NET内存机制:堆、栈与装箱拆箱的底层逻辑及优化技巧
  • 【软件设计师】信息安全
  • Mac本地docker安装Kibana+ElasticSearch