Python虚拟环境指南:告别依赖地狱

news2024/9/24 3:30:33

一、背景

在SAAS(软件即服务)平台中,用户使用自行定制的Python脚本已经成为司空见惯的做法,然而,由于不同用户对Python三方库的需求各不相同,而底层服务器一般只安装了一个Python版本。举例来说,假设用户A需要pymysql=1.0.2版本,而用户B需要pymysql=1.0.3版本,那么我们该如何应对呢?

当我们考虑将系统安装的Python的pymysql三方库依赖升级至1.0.3版本时,这必然会对用户A产生潜在的风险和影响。这就迫使我们需要一种解决方案,能够满足不同用户或租户对不同Python库版本的需求,而不会相互干扰。这也是本文要深入阐述的关键内容。

解决方案就在于Python虚拟环境。通过创建独立的、隔离的Python运行环境,我们可以满足不同用户对Python库的需求,而无需牵扯到底层服务器已安装的Python版本。这使得每个用户或租户能够拥有自己的Python环境,可以在其中自由地安装、更新和管理所需的Python库,而不会干扰其他用户。

二、原理

2.1、Python依赖关系

在 Python 的生态系统中,依赖分为标准库和三方库两种,它们在开发过程中起着不同的作用:

  1. 标准库是由Python官方团队维护和发布的一组模块和库。这些模块和库包含了丰富的工具和功能,涵盖了文件I/O、字符串操作、网络通信、数学计算、数据结构、日期时间处理等方面。这些模块是Python解释器的一部分,在安装Python时会一同安装。标准库的模块常被广泛应用于各类Python应用程序中,因为它们保证了跨平台的兼容性和稳定性。
  2. 三方库则是由Python社区贡献和维护的库,这些库提供了丰富的功能,包括数据处理、Web开发、科学计算等领域。与标准库不同,三方库不随Python解释器的安装而自动包含,需要使用包管理工具如pip来安装。它们的多样性和灵活性为开发者提供了更广泛的选择空间,可以根据特定需求轻松获取所需功能。
  3. 安装目录在文件系统中,Python标准库的模块位于安装目录下的Lib目录内,而三方库则被安装在Lib/site-packages目录下。这种结构有助于开发者在系统中准确找到和管理所需的库,如下图:

在这里插入图片描述

2.2、虚拟环境依赖原理

Python虚拟环境实现了一种高效的依赖隔离机制,其核心原理在于充分利用系统Python的标准库,而三方库则被完全隔离存储于虚拟环境中的独立目录。

在Python虚拟环境中,标准库的管理与系统Python的标准库实现共享。这意味着虚拟环境不会单独复制系统Python的标准库,而是通过指向系统Python标准库的符号链接进行访问。这种方式确保了虚拟环境中的Python标准库与系统Python保持同步,同时避免了资源浪费。

与标准库不同,三方库在虚拟环境中得到了彻底的隔离。每个虚拟环境都拥有自己独立的Lib/site-packages目录,用于存储安装的三方库。通过这种机制,不同虚拟环境内的项目可以安全地使用不同版本或不同组合的三方库,而无需担心相互干扰或产生冲突,如下图:

在这里插入图片描述

三、实战

3.1、venvpyvenvvirtualenv 区别

创建Python虚拟环境通常有三种常用的命令:venvpyvenvvirtualenv

  1. venv:
    • venv 是 Python 3.3 及以上版本自带的标准库模块。
    • 这个命令能够快速创建Python虚拟环境,并提供了一种简洁而有效的方式来隔离项目的依赖关系。
    • 使用方法是通过运行 python -m venv myenv 来创建一个名为 myenv 的虚拟环境。
  2. pyvenv:
    • pyvenv 是 Python 3.3 之前版本中的一个命令,用于创建虚拟环境。
    • 它的功能与 venv 类似,但在较新的Python版本中已经不再推荐使用,并被 venv 替代。
  3. virtualenv:
    • virtualenv 是一个第三方库,能够在 Python 2.x 和 3.x 版本中使用。
    • 与前两者不同,virtualenv 提供了更多的灵活性和高级选项,可以为用户提供更加定制化的虚拟环境。
    • 通过运行 pip install virtualenv 安装后,可以使用命令 virtualenv myenv 创建一个名为 myenv 的虚拟环境。

总体来说,venvvirtualenv 是创建Python虚拟环境最常用的方式。venv 是Python自带的标准库模块,提供了基本的虚拟环境功能,而 virtualenv 则提供了更多定制和高级选项,能够满足更复杂的需求。pyvenv 已在较新版本的Python中被弃用,建议使用更为推荐的 venv

3.2、创建虚拟环境

先通过执行 venv 指令来创建一个 虚拟环境: 运行此命令将会生成一个目标目录(如果其父目录不存在,也会被创建)

root@b3268f2479f8:~# python3 -m venv /usr/local/env/myenv
root@b3268f2479f8:~# ll /usr/local/env/myenv
total 16
drwxr-xr-x 2 root root 4096 Dec 15 06:48 bin
drwxr-xr-x 3 root root 4096 Dec 15 06:48 include
drwxr-xr-x 3 root root 4096 Dec 15 06:48 lib
lrwxrwxrwx 1 root root    3 Dec 15 06:48 lib64 -> lib
-rw-r--r-- 1 root root  177 Dec 15 06:48 pyvenv.cfg

同时在目标目录中会放置一个名为pyvenv.cfg的文件。这个配置文件内包含了一个home键,指向运行此命令的 系统 Python 命令位置:

root@b3268f2479f8:~# cat /usr/local/env/myenv/pyvenv.cfg
home = /usr/local/bin
include-system-site-packages = false
version = 3.12.1
executable = /usr/local/bin/python3.12
command = /usr/local/bin/python3 -m venv /usr/local/env/myenv

此外,命令还会在目标目录中创建一个bin子目录,其中包含了 Python 可执行文件的拷贝或符号链接。同时,还会建立一个初始为空的lib/pythonX.Y/site-packages子目录,用于存放虚拟环境执行pip安装的三方库:

3.3、激活虚拟环境

激活一个虚拟环境可以通过source 一个脚本来实现。在 linux 系统上,该脚本位于 bin 目录下的 activate。这个激活操作的效果是将该目录添加到你的 PATH 环境变量中。这样,当你运行 python 时,系统会调用虚拟环境的 Python 解释器,使你能够轻松运行虚拟环境中安装的脚本,而无需使用完整的路径信息,如下:

激活虚拟环境后,命令行头部会显示虚拟环境的名称(myenv)以提示你当前所处的环境,此时执行pip依赖三方库命令:由于虚拟环境被激活,故此时执行的pip命令会因为环境变量使用该虚拟环境中的pip,而不是系统全局的pip

可以看到kafka依赖只存在于虚拟环境三方库目录,系统环境不受影响。

3.4、停用虚拟环境

停用(或退出)虚拟环境只需执行 deactivate 命令即可。执行该命令后,命令行提示符中不再显示虚拟环境的名称,并且系统的 $PATH 环境变量会回到默认状态,如下:

# 激活时$PATH
(myenv) root@b3268f2479f8:/usr/local/env/myenv# echo $PATH
/usr/local/env/myenv/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# 停用时$PATH
(myenv) root@b3268f2479f8:/usr/local/env/myenv# deactivate
root@b3268f2479f8:/usr/local/env/myenv# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

3.5、直接使用虚拟环境

其实激活虚拟环境并不是必须的,因为你可以直接指定特定虚拟环境的Python解释器完整路径来调用Python。更进一步地说,安装在虚拟环境中的所有脚本也可以在不激活虚拟环境的情况下运行,例如:

此外,如果我们要使用虚拟环境的Python来执行python脚本,我们可以在脚本中包含一个以“井号叹号”开头的行,用来指定虚拟环境的Python解释器路径,例如 #!/<path-to-venv>/bin/python。这意味着无论$PATH的取值如何,该脚本都将使用指定的解释器来运行。

以下是一个示例,假设有一个名为example_script.py的脚本,它指定了虚拟环境中Python解释器的路径:

#!/usr/local/env/myenv/bin/python

def main():
    print("这个脚本安装在虚拟环境中,并使用指定的解释器运行!")

if __name__ == "__main__":
    main()

在这个示例中,#!/usr/local/env/myenv/bin/python 表示脚本将使用位于虚拟环境中的Python解释器来执行。

因此,无需激活虚拟环境,该脚本都将使用特定虚拟环境中的解释器来运行。

3.6、删除虚拟环境

由于Python虚拟环境被视为可以随时丢弃和重建的,你可以直接使用 rm 命令(在Unix或类Unix系统中)来删除整个虚拟环境目录。

假设你的虚拟环境名称为 myenv,你可以在命令行中执行以下命令来删除:

root@b3268f2479f8:/usr/local/env# rm -rf myenv/

请注意,这样的删除操作是不可逆的。删除后,虚拟环境中的所有数据和安装的包都将被永久移除。确保你删除的是正确的虚拟环境路径,以免不小心删除了重要数据。

3.5、虚拟环境迁移部署

由于安装在虚拟环境中的脚本不要求必须激活该虚拟环境,因此它们的“井号叹号”行会包含虚拟环境的绝对路径,如下图:

这种情况下,虚拟环境是不可移植的。为确保便捷地重建虚拟环境,你应当提供简便的方式(例如,若你已准备好需求文件 requirements.txt,可使用虚拟环境的 pip 执行 pip install -r requirements.txt 命令来安装虚拟环境所需的所有软件包)如下:

# 创建requirements.txt
(myenv) root@b3268f2479f8:/usr/local/env/myenv# pip freeze > requirements.txt
(myenv) root@b3268f2479f8:/usr/local/env/myenv# cat requirements.txt
certifi==2023.11.17
charset-normalizer==3.3.2
confluent-kafka==2.3.0
idna==3.6
requests==2.31.0
urllib3==2.1.0

如果因某种原因你需要将虚拟环境移动到新位置,你应当在目标位置上重新创建虚拟环境,并删除旧位置上的虚拟环境。同样,如果你移动了虚拟环境的上级目录,也应在新位置上重新创建虚拟环境。否则,安装在该虚拟环境中的软件包可能无法正常运行。

举例来说,假设你在 /usr/local/env/myenv 目录下创建了一个虚拟环境,现在你想将它移动到 /usr/local/env/myenv2/ 目录。你可以执行以下步骤:

  1. 在目标位置上重建虚拟环境

    python3 -m venv /usr/local/env/myenv2  # 使用 venv 创建一个名为 myenv 的新虚拟环境
    
  2. 使用 requirements.txt 安装所需的软件包

    cd /usr/local/env/myenv2
    source bin/activate  # 激活新的虚拟环境
    pip install -r /usr/local/env/myenv/requirements.txt
    

这样可以确保在新位置重新创建了虚拟环境,并安装了相同的软件包。移动虚拟环境时,务必谨慎操作以确保其中的软件包能够正常工作。

四、结语

Python虚拟环境是Python开发者不可或缺的利器。它为开发者提供了一个独立、隔离的Python工作空间,使得不同项目之间的依赖管理更为灵活和高效。通过虚拟环境,开发者可以轻松地控制Python版本和安装的库,确保项目开发的稳定性和可靠性。

五、相关资料

python虚拟环境官方文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1313046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【STM32单片机】旋转太空人设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器&#xff0c;使IIC OLED液晶等。 主要功能&#xff1a; 系统运行后&#xff0c;OLED显示动画界面。 二、软件设计 /* 作者&#xff1a;嗨小易&#xff08;QQ&#x…

Stable Diffusion 系列教程 - 3 模型下载和LORA模型的小白入门

首先&#xff0c;一个比较广泛的模型下载地址为&#xff1a;Civitai Models | Discover Free Stable Diffusion Models 黄框是一些过滤器&#xff0c;比如checkpoints可以理解为比如把1.5版本的SD模型拷贝一份后交叉识别新的画风或场景后得到的模型&#xff0c;可以单独拿出来使…

[CC13X0] XDS100V3连接报错:Make sure your device is unlocked.

用XDS100V3给CC1310下载程序时&#xff0c;发现如下连接错误&#xff1a; An error occurred while hard opening the controller. -----[An error has occurred and this utility has aborted]-------------------- This error is generated by TIs USCIF driver or utilities…

mysql 数据库 关于库的基本操作

库的操作 如果想到 mysql 客户端当中数据 系统当中的命令的话&#xff0c;直接输入的话&#xff0c;会被认为是 mysql 当中的命令。 所以&#xff0c;在mysql 当中执行系统当中的命令的话&#xff0c;要在系统命令之前带上 ststem &#xff0c;表示系统命令&#xff1a; 但是…

[css] flex wrap 九宫格布局

<div class"box"><ul class"box-inner"><li>九宫格1</li><li>九宫格2</li><li>九宫格3</li><li>九宫格4</li><li>九宫格5</li><li>九宫格6</li><li>九宫格7&l…

2024年高效远程协同运维工具推荐

随着企业的不断发展以及变化&#xff0c;企业的内部IT环境也是日益复杂&#xff0c;一跨高效远程协同运维工具必不可少&#xff0c;不仅可以提高生产力&#xff0c;还能降低运营成本。这里就给大家推荐2024年高效远程协同运维工具。 高效远程协同运维工具应用场景 1、IT运维管…

WPF仿网易云搭建笔记(1):项目搭建

文章目录 前言项目地址动态样式组合样式批量样式覆盖Prism新建UserControler修改Material Design 笔刷收放列表可以滚动的StackPanel列表点击展开或折叠 实现效果 前言 今天接着继续细化代码&#xff0c;把整体框架写出来 项目地址 WPF仿网易云 Gitee仓库 动态样式 【WPF】C#…

linux 查看服务启动时间

文章目录 linux 查看服务启动时间参数解析 linux 查看服务启动时间 [root104 ~]# ps -o lstart -p ps -ef |grep -v grep |grep "zookeeper"|awk {print$2}STARTED Fri Dec 15 16:54:10 2023参数解析 linux 命令中 ps -ef 详解 ps -ef表示查看全格式的进程。 ps …

视频号小店需要缴纳保证金吗?保证金缴纳标准,不懂的快来看!

我是电商珠珠 入驻视频号小店&#xff0c;需要缴纳保证金吗&#xff1f;具体缴纳多少&#xff1f;... 这是想要入驻视频号小店的热门话题&#xff0c;今天我就来给大家一一讲明白。 想要入驻视频号小店&#xff0c;就必须要缴纳保证金。保证金是平台为了约束商家的行为&…

LLM之Agent(六)| 使用AutoGen、LangChian、RAG以及函数调用构建超级对话系统

本文我们将尝试AutoGen集成函数调用功能。函数调用最早出现在Open AI API中&#xff0c;它允许用户调用外部API来增强系统的整体功能和效率。例如&#xff0c;在对话过程中根据需要调用天气API。 函数调用和Agent有各种组合&#xff0c;在这里我们将通过函数调用调用RAG检索增强…

Windows 7如何将分区标记为活动分区?

引导分区&#xff0c;也称为引导卷&#xff0c;是包含引导加载程序和Windows操作系统所需文件的磁盘分区&#xff0c;是正常启动计算机的前提。一个正确的引导分区不只要包含相关的可引导数据&#xff0c;还需要将分区标记为活动分区。那么&#xff0c;如何将Windows 7分区标记…

网络安全——基于Snort的入侵检测实验

一、实验目的要求&#xff1a; 二、实验设备与环境&#xff1a; 三、实验原理&#xff1a; 四、实验步骤&#xff1a; 五、实验现象、结果记录及整理&#xff1a; 六、分析讨论与思考题解答&#xff1a; 七、实验截图&#xff1a; 一、实验目的要求&#xff1a; 1、掌握…

SuperMap iPortal权限介绍

作者&#xff1a;yx 文章目录 前言一、内置权限二、自定义权限&#xff08;11.1.0及以后版本&#xff09;1、修改配置文件2、页面展示3、api调用4、结果验证5、实际应用 前言 iPortal 用户访问和使用门户中资源的能力取决于其用户类型与在门户中拥有的权限&#xff0c;权限通过…

深入分析ClassLocader工作机制

文章目录 一、ClassLoader简介1. 概念2. ClassLoader类结构分析 二、ClassLoader的双亲委派机制三、Class文件的加载流程1. 简介2. 加载字节码到内存3. 验证与解析4. 初始化Class对象 四、常见加载类错误分析1. ClassNotFoundException2. NoClassDefFoundError3. UnsatisfiledL…

2023.12.13 关于 MySQL 复杂查询

目录 聚合查询 聚合函数 group by 子句 执行流程图 联合查询 笛卡尔积 内连接 外连接 左外连接 右外连接 自连接 子查询 单行子查询 多行子查询 EXISTS 关键字 合并查询 union on 和 union 的区别 聚合查询 聚合函数 函数说明COUNT([DISTINCT] expr)返回查询到…

wpf TelerikUI使用DragDropManager

首先&#xff0c;我先创建事务对象ApplicationInfo&#xff0c;当暴露出一对属性当例子集合对于构成ListBoxes。这个类在例子中显示如下代码&#xff1a; public class ApplicationInfo { public Double Price { get; set; } public String IconPath { get; set; } public …

【【ZYNQ 7020显示 图片 实验 】】

ZYNQ 7020显示 图片 实验 关键配置 BRAM 因为本次 我想显示的 图片是 400*400 所以在 内部 的 ROM 存储单元选择 了160000 ZYNQ7020的内部资源 最多是 大概 200000左右的 大小 大家可以根据 资源选择合适的像素 此处存放 内部的 图片转文字的COE文件 PLL设置 我选用的是按…

详解wmvcore.dll丢失的解决方法

wmvcore.dll是一款由Microsoft开发的Windows系统文件&#xff0c;主要用于存储和处理多媒体文件&#xff0c;尤其是Windows媒体视频。该文件对于音频和视频的播放至关重要。如果电脑上缺少这个文件&#xff0c;可能会出现播放问题或者相关的应用程序运行错误。在本文中&#xf…

Netty详解

目录标题 1、前期知识科普1.1 NIO 基本概念1.2 java BIO与NIO对比1.3 Reactor 模型 2、Netty 基础概念2.1 Netty 简介2.2 Netty 执行流程2.3 Netty 核心组件 3、Netty Demo编写3.1 总体框架3.2 具体代码 4、交流群 1、前期知识科普 1.1 NIO 基本概念 阻塞&#xff08;Block&a…

0x21 树与图的遍历

0x21 树与图的遍历 树与图最常见的储存方式就是使用一个邻接表保存它们的边集。邻接表以head数组为表头&#xff0c;使用ver和edge数组分别存储边的终点和权值&#xff0c;使用next数组模拟链表指针&#xff08;就像我们在0x13节中讲解邻接表所给出的代码那样&#xff09;。 …