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

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

一、背景

在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/pythondef 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虚拟环境官方文档

相关文章:

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

一、背景 在SAAS&#xff08;软件即服务&#xff09;平台中&#xff0c;用户使用自行定制的Python脚本已经成为司空见惯的做法&#xff0c;然而&#xff0c;由于不同用户对Python三方库的需求各不相同&#xff0c;而底层服务器一般只安装了一个Python版本。举例来说&#xff0…...

【Jeecg Boot 3 - 第二天】第2节 前后端docker部署云服务器

更新完成&#xff0c;点击下面章节进入 一、后端部署 1.1、后端 docker-compose 部署 JEECGBOOT 1.2、jar 包和 lib 依赖分离&#xff0c;部署包缩小100倍 二、前端部署 2.1、nginx 部署 JEECGBOOT VUE3 2.2、开启Nginx压缩&#xff0c;解决前端访问慢问题...

2020年第九届数学建模国际赛小美赛A题自由泳解题全过程文档及程序

2020年第九届数学建模国际赛小美赛 A题 自由泳 原题再现&#xff1a; 在所有常见的游泳泳姿中&#xff0c;哪一种最快&#xff1f;哪个冲程推力最大&#xff1f;在自由泳项目中&#xff0c;游泳者可以选择他们的泳姿&#xff0c;他们通常选择前面的爬行。然而&#xff0c;游泳…...

双端队列和优先级队列

文章目录 前言dequedeque底层设计迭代器设计 priority仿函数数组中的第k个最大元素优先级队列模拟实现pushpop调整仿函数存储自定义类型 前言 今天要介绍比较特殊的结构&#xff0c;双端队列。 还有一个适配器&#xff0c;优先级队列。 deque 栈的默认容器用了一个deque的东西…...

c#读取CSV文件跟Excel导入成DataTble

1.读取CSV文件 /// <summary>/// 读取CSV文件/// </summary>/// <param name"fileName">文件路径</param>public static DataTable ReadCSV(string fileName){DataTable dt new DataTable();FileStream fs new FileStream(fileName, FileM…...

Python编程技巧 – 单字符函数

Python编程技巧 – 单字符函数 Python Programming Skills – Single Character Function By JacksonML 0. 前言 Python有其内建(built-in)的一系列函数&#xff0c;其中&#xff0c;有两个函数为长度为一的字符设计。这样的函数是单字符函数&#xff0c;尽管它们操作的对象…...

xcode-文件

IOSDeviceSupoprt 共享缓存库 当你使用新的 iOS 设备连接到 Xcode 时&#xff0c;Xcode 会自动下载并存储相应版本的设备支持文件。 每个 iOS 版本都有一个对应的设备支持文件集&#xff0c;这些文件包含有关设备架构和操作系统的信息&#xff0c;以便 Xcode 能够正确地调试和…...

云原生之深入解析网络服务Istio、eBPF和RSocket Broker

一、服务治理 ① “服务治理”简介 在微服务时代&#xff0c;一个复杂的应用程序被分解为多个组件化、协作和连接的单元&#xff0c;服务往往会承担越来越多的业务责任&#xff0c;这使得服务治理的难度前所未有&#xff0c;仅仅依靠微服务框架级的治理是不够的&#xff0c;构…...

文件系统和磁盘调度

文件系统 概述 文件系统&#xff1a;一种用于持久性存储的系统抽象 在存储器上&#xff1a;组织、控制、导航、访问和检索数据大多数计算机包含文件系统 文件&#xff1a;文件系统中一个单元的相关数据在操作系统中的抽象 文件系统功能 分配文件磁盘空间 管理文件块管理空…...

C++ stringOJ练习题

目录 把字符串转换成整数 反转字符串 字符串中的第一个唯一字符 字符串最后一个单词的长度 找出字符串中第一个只出现一次的字符 字符串相加 字符串最后一个单词长度 字符串相乘 反转字符串3 反转字符串2 验证回文串 把字符串转换成整数 通过遍历字符串并逐位转换…...

解决问题:ImportError: cannot import name ‘_update_worker_pids‘

在复现一些较早年份文献时&#xff0c;网络架构是较早的Pytorch模型&#xff0c;现阶段的高版本不兼容&#xff0c;所以就得安装比如低版本的torch0.4.0以解决问题。 目录 一、问题1.1 问题分析 二、解决办法2.1 Pytorch安装2.2 torchvision安装2.3 测试是否安装成功 三、总结…...

【面试总结】Java面试题目总结(一)

&#xff08;以下仅为个人见解&#xff0c;如果有误&#xff0c;欢迎大家批评并指出错误&#xff0c;谢谢大家&#xff09; 1.项目中的验证码功能是如何实现的&#xff1f; 第一步&#xff1a;在项目的pom.xml文件中导入 EasyCaptcha 的依赖&#xff1b; <dependency>…...

大白话数据中台,何为数据中台

文章目录 一、数据中台二、本质三、构建数据中台的几个方面四、总结 最近一直在研发Ai平台&#xff0c;忙碌非凡。 在之余&#xff0c;有小伙伴质疑数据中台其实就是一个web系统&#xff0c;无法就是添加一些业务逻辑的增删改查。 答曰&#xff1a; 回去好好把科普下什么是数…...

escapeshellarg参数绕过和注入的问题

escapeshellcmd escapeshellcmd(string $command): string command--要转义的命令。 escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数&#xff0c;或者 执行操作符 之前进行转义。 …...

CSS——标准流、浮动、Flex布局

1、标准流 标准流也叫文档流&#xff0c;指的是标签在页面中默认的排布规则&#xff0c;例如&#xff1a;块元素独占一行&#xff0c;行内元素可以一行显示多个。 2、浮动 作用&#xff1a;让块元素水平排列 属性名&#xff1a;float 属性值&#xff1a; left&#xff1a;…...

P21 类神经网络训练不起来怎么办- 自动调整学习率 Adapative learning rate

梯度大&#xff0c;学习率减小梯度小&#xff0c;学习率变大adam随时间变化 &#xff0c; decay / warm up 调整学习率方法一 adagrad 学习率除以 梯度的方差 方法二 RMSProp 目前最常用的&#xff1a; Adam: RMSProp Moment Learning rate schedule : decay/ warm up l…...

[Linformer]论文实现:Linformer: Self-Attention with Linear Complexity

文章目录 一、完整代码二、论文解读2.1 介绍2.2 Self-Attention is Low Rank2.3 模型架构2.4 结果 三、整体总结 论文&#xff1a;Linformer: Self-Attention with Linear Complexity 作者&#xff1a;Sinong Wang, Belinda Z. Li, Madian Khabsa, Han Fang, Hao Ma 时间&#…...

【Jeecg Boot 3 - 第二天】1.1、后端 docker-compose 部署 JEECGBOOT3

一、场景 二、实战 ▶ 2.1 修改配置文件 &#xff1e; 目的一&#xff1a;将 dev 变更为生产环境 prod &#xff1e; 目的二&#xff1a;方便spring项目调用docker同个network下的redis和mysql ▶ 2.2 编写dockerfile ▶ 2.3 编写docker-compose.yaml ▶ 2.4 打…...

Centos单用户模式修改root密码

在CentOS 7的单用户模式下&#xff0c;你可以按照以下步骤修改root用户密码&#xff1a; 启动CentOS 7并进入GRUB菜单。在启动时按下任意键进入GRUB菜单。 在GRUB菜单中&#xff0c;选择要启动的CentOS 7内核版本&#xff0c;并按下e键进行编辑。 找到以 ro 开头的行&#xf…...

[Unity]关于Unity接入Appsflyer并且打点支付

首先需要去官方下载Appsflyer的UnityPackage 链接在这afPackage 然后导入 导入完成 引入此段代码 using AppsFlyerSDK; using System.Collections; using System.Collections.Generic; using UnityEngine;public class AppflysManager : MonoBehaviour {public static App…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日&#xff0c;在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上&#xff0c;可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞&#xff0c;强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...

负载均衡器》》LVS、Nginx、HAproxy 区别

虚拟主机 先4&#xff0c;后7...