conda虚拟环境安装包、依赖同一管理
在 Python 的虚拟环境中,每个环境都是独立的,这意味着即使两个环境需要相同的库,它们也会分别安装各自的副本。这样做是为了避免不同项目之间相互影响,确保每个项目都有一个干净且隔离的环境。
方法一:使用 Conda 的共享环境
当多个上层的虚拟环境在同一时刻调用基础虚拟环境中的 torch
时,通常情况下是不会有问题的,因为每个虚拟环境都是独立的。然而,我们需要明确 conda create --clone
的实际行为以及它是如何工作的。
Conda create --clone
的底层步骤
当你使用 conda create --clone
命令创建一个新的环境时,实际上并不会直接引用底层虚拟环境的依赖包,而是创建了一个与源环境具有相同依赖关系的新环境。具体来说,底层步骤如下:
- 解析依赖关系:Conda 会解析源环境中的所有依赖关系及其版本。
- 创建新环境:Conda 在指定的目标位置创建一个新的环境目录。
- 安装依赖:Conda 会从其包存储库中下载并安装与源环境相同的依赖包及其版本到新环境中。
- 保留环境一致性:新环境中的依赖关系、版本和配置与源环境保持一致。
这意味着,尽管新环境与源环境看起来是一样的,但实际上它们是完全独立的,每个环境中的依赖包都是单独安装的。因此,当多个上层环境调用相同的库(如 torch
)时,它们实际上各自拥有独立的拷贝,不会互相影响。
步骤:使用 conda create --clone
假设你有一个基础环境 shared_env
,其中已经安装了 torch
、cuda
和 tensorflow
。
conda create --name shared_env torch cuda tensorflow
conda activate shared_env
现在你想要创建一个新的环境 project_env_A
,并克隆 shared_env
:
conda create --name project_env_A --clone=shared_env
conda activate project_env_A
此时,project_env_A
中将会包含与 shared_env
相同的依赖关系及其版本。这意味着 project_env_A
中的 torch
是独立安装的,并且与其他克隆环境中的 torch
没有直接关联。
多个环境同时调用 依赖包
当多个上层环境在同一时刻调用 依赖包
时,它们实际上是在各自环境中调用的 torch
,因此不会发生冲突。每个环境都有自己的 Python 解释器和库路径设置,所以即使多个环境同时运行也不会互相干扰。
总结(复制虚拟环境的捷径而已,但还是复制)
conda create --clone命令实际上是在新的环境中复制了一份基础虚拟环境的依赖关系。这意味着对于每一个依赖包,包括
torch` 或其他大型库,都会在新的环境中重新下载并安装一份。因此,在存储空间上,每一个克隆的环境都会占用与原环境相似的空间大小,因为它们包含了各自的依赖包副本。
这不同于直接共享文件或链接到原始安装,而是创建了一个完全独立的环境,这样做的好处是保证了环境之间的隔离性和可重复性,但是缺点就是会消耗更多的磁盘空间,尤其是在克隆多个环境或者库较大的情况下。如果你需要管理大量的环境并且担心磁盘空间的问题,可以考虑定期清理不再使用的环境或者使用带有存储优化功能的文件系统。
通过这种方式,你可以确保在多个上层环境中调用基础环境中的依赖(如 torch
)时,系统能够正常运行,并且各个环境之间不会互相影响。
方法二:使用 Conda 包链接
如果你已经有了一个标准的 requirements.txt
文件,其中只列出了包名和版本,并且利用已下载的本地包转为yaml
文件,最后将本地依赖包链接到虚拟环境中
1. 根据给定的requirements.txt转换为基础版yaml文件
#!/bin/bash# Conda 包缓存目录
conda_cache_dir=$(conda config --show pkgs_dirs | awk '{print $2}')# 读取 requirements.txt 文件
dependencies_file="requirements.txt"
environment_yml="environment.yml"# 创建初始的 environment.yml 文件
cat > "$environment_yml" <<EOF
name: new_env
dependencies:
EOF# 读取 requirements.txt 文件中的依赖项
while IFS= read -r line; do# 检查依赖项是否为空或注释行if [[ -z $line || $line =~ ^# ]]; thencontinuefi# 添加依赖项到 environment.yml 文件echo " - $line" >> "$environment_yml"# 搜索本地路径local_path=$(find "$conda_cache_dir" -type f -name "*$line*.tar.bz2")# 如果找到了本地路径,则添加到 environment.yml 文件if [[ -n $local_path ]]; thenecho " - $line: $local_path" >> "$environment_yml"fi
done < "$dependencies_file"# 显示最终的 environment.yml 文件
cat "$environment_yml"
2. 编写脚本处理 environment.yml
文件
接下来,我们可以编写一个脚本来读取 environment.yml
文件,并根据文件中的信息安装依赖项。以下是一个示例脚本:
#!/bin/bash# 创建新的环境
conda create --name new_env
conda activate new_env# 读取 environment.yml 文件中的依赖项并逐个安装
while IFS= read -r line; doif [[ $line =~ ^\s*- ]]; then# 提取包名和本地路径(如果有)pkg=$(echo $line | sed 's/^-\s*//')local_path=$(echo $pkg | grep -oP "(?<=: ).*")# 如果有本地路径,则安装本地包;否则安装远程包if [[ -n $local_path ]]; thenconda install --use-local --file $local_pathelseconda install --use-local $pkgfifi
done < environment.yml
注意事项
- 路径正确性:确保在
environment.yml
文件中提供的本地路径是正确的,并且文件确实存在于指定位置。 - 依赖关系:使用
--use-local
时,Conda 会尝试从本地已下载的包中找到匹配的包。如果本地没有匹配的版本,Conda 会从远程仓库下载缺失的包。 - 版本兼容性:确保所使用的本地包版本与其他依赖项兼容。如果不兼容,Conda 可能会下载其他版本的包来满足依赖关系。
总结
通过这种方法,你可以利用已下载的本地包来创建新的环境,并且可以在 environment.yml
文件中灵活地指定本地路径。这种方法适用于已经下载了所有需要的包,并且希望在创建新环境时尽量使用这些本地包的情况。
总结
通过这种方法,你可以利用已下载的本地包来创建新的环境,并且简化了从 requirements.txt
文件创建环境的过程。这种方法适用于已经下载了所有需要的包,并且希望在创建新环境时尽量使用这些本地包的情况。
相关文章:
conda虚拟环境安装包、依赖同一管理
在 Python 的虚拟环境中,每个环境都是独立的,这意味着即使两个环境需要相同的库,它们也会分别安装各自的副本。这样做是为了避免不同项目之间相互影响,确保每个项目都有一个干净且隔离的环境。 方法一:使用 Conda 的共…...
Unity网络开发记录(四):在unity中进一步封装客户端类
在上一篇文章中,简单的封装了一下服务端中相关的socket对象,为了可以更方便的使用。所以在本篇中,进一步封装一下在unity中的相关客户端类 封装客户端类,首先采用单例模式,然后采用两个队列来存储我们相关的收发信息 p…...
Linux内核中的UART驱动-详解Linux内核UART驱动:结构与功能分析
一、UART概述 UART(Universal Asynchronous Receiver/Transmitter),即通用异步收发器,是一种串行通信接口,用于在计算机和外部设备之间传输数据。它特别适用于短距离、低速、串行和全双工的数据传输。在Linux内核中&a…...
威胁检测与防范:如何及时、准确对抗安全风险
随着技术的飞速发展,网络空间中的威胁日益多样化、隐蔽化,给个人、企业乃至国家的信息安全带来诸多挑战。面对严峻的网络威胁,传统的防火墙、入侵检测系统(IDS)等防御手段虽能在一定程度上抵御外部攻击,但依…...

数据结构串的kmp相关(求next和nextval)
傻瓜版,用来演示手算过程,个人理解用的,仅供参考。...

创建游戏暂停菜单
创建用户控件 设置样式 , 加一层 背景模糊 提升UI菜单界面质感 , 按钮用 灰色调 编写菜单逻辑 转到第三人称蓝图 推荐用 Set Input Mode Game And UI , 只用仅UI的话 增强输入响应不了 让游戏暂停的话也可以用 Set Game Paused , 打勾就是暂停 , 不打勾就是继续游戏 , 然后…...

seata服务端部署
1.下载seata 官网下载地址:http://seata.io/zh-cn/blog/download.html 或者下载 作者已经下载的压缩包1.4.0 注意!!! 要参考对应的版本,否则可能出现无法正常启动的情况。 参考文档 下载完毕后解压压缩文件 2.修改配…...

理解Python闭包概念
闭包并不只是一个python中的概念,在函数式编程语言中应用较为广泛。理解python中的闭包一方面是能够正确的使用闭包,另一方面可以好好体会和思考闭包的设计思想。 1.概念介绍 首先看一下维基上对闭包的解释: 在计算机科学中,闭包…...

51单片机的教室智能照明系统【proteus仿真+程序+报告+原理图+演示视频】
1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块DS1302时钟模块光照传感器红外传感器温度传感器LED等模块构成。适用于教室灯光全自动控制、教室节能灯控制、教室智能照明等相似项目。 可实现功能: 1、LCD1602实时显示时间、温度、光照强度等信息 2、光照强度传…...
一款资产进行快速存活验证工具
01工具介绍 (下载地址见最后) 在日常工作的渗透测试过程中,经常会碰到渗透测试项目,而Web渗透测试通常是渗透项目的重点或者切入口。通常拿到正规项目授权后,会给你一个IP资产列表和对应的Web资产地址,这时…...

I/O中断处理过程
中断优先级包括响应优先级和处理优先级,响应优先级由硬件线路或查询程序的查询顺序决定,不可动态改变。处理优先级可利用中断屏蔽技术动态调整,以实现多重中断。下面来看他们如何运用在中断处理过程中: 中断控制器位于CPU和外设之…...
关于PHP 匿名函数在处理数据结构中的应用
PHP 的匿名函数(也称为闭包)在处理数据结构时非常有用。它们可以在需要一次性函数的情况下使用,例如数组函数的回调、事件处理或作为其他函数的参数。以下是一些常见的应用场景: 数组操作: 使用 array_map、array_fil…...

安卓13默认使用大鼠标 与配置分析 andriod13默认使用大鼠标 与配置分析
总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.彩蛋1.前言 android13里面的鼠标貌似比以前版本的鼠标小了,有些客户想要把这个鼠标改大。这个功能,android有现成的,就在这里,设置 =》无障碍 =》色彩和动画 =》 大号鼠标指针。 我们通过…...
AI学习指南深度学习篇-批标准化在深度学习中的应用
AI学习指南深度学习篇-批标准化在深度学习中的应用 引言 批标准化(Batch Normalization, BN)是一种在深度学习中常用的技术,旨在加速训练过程并提高模型的稳定性。它通过标准化每一个小批量的激活值,减小内部协变量偏移…...

了解网络的相关信息
文章目录 前言了解网络的相关信息1. ip是什么?1.1. 公网IP:1.2. 私有IP:1.2.1. 示例 2. 子网掩码3. 子网掩码的划分网段是什么4. 特殊的回路IP网段(127.0.0.1)5. 端口 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊&#x…...

Java | Leetcode Java题解之第447题回旋镖的数量
题目: 题解: class Solution {public int numberOfBoomerangs(int[][] points) {int ans 0;for (int[] p : points) {Map<Integer, Integer> cnt new HashMap<Integer, Integer>();for (int[] q : points) {int dis (p[0] - q[0]) * (p[…...
Docker实践与应用举例
引言 Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。本文将详细介绍 Dock…...

828华为云征文 | 智能监控新篇章,Prometheus如何在华为云Flexusx容器环境中大展身手
前言 在数字化转型的浪潮中,智能监控成为企业IT战略的关键环节。部署在华为云Flexus X实例上的Prometheus监控系统,凭借其卓越的性能与灵活性,正开启智能监控的新篇章。Flexus X实例以其强大的计算能力和灵活的资源管理,为Prometh…...

基于单片机的可调式中文电子日历系统
** 文章目录 前言概要功能设计软件设计效果图 程序文章目录 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们…...
《C++设计新思维-泛型编程与设计模式之应用》阅读记录
目录 写在前面policy和policy class的认识 写在前面 这本书是2003年出版的,大佬侯捷翻译的,21年前的书了,最近打算翻一翻。 看这种技术书籍,特别是简历理论体系的书籍,最好看纸质书。 本书从根本上展示了generic pa…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...