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…...
Vim插件vim-gpt-commit:基于AI自动生成Git提交信息的实践指南
1. 项目概述:当Vim遇上AI,让Git提交信息告别“fix bug”作为一名在Vim和Git世界里摸爬滚打了十多年的老码农,我深知写好一个Git提交信息有多重要,又有多烦人。多少次,在完成一段复杂的代码修改后,面对那个空…...
Godot弹幕游戏开发利器:BulletUpHell插件核心功能与实战指南
1. 项目概述:一个为弹幕地狱游戏而生的强大引擎如果你正在用Godot引擎开发一款弹幕射击游戏(也就是我们常说的“弹幕地狱”或“STG”),并且正在为如何高效、灵活地生成成千上万颗轨迹各异的子弹而头疼,那么你很可能需要…...
Vibe Coding:打造沉浸式编程学习环境,从环境到心流的高效开发实践
1. 项目概述:从“Vibe Coding”到沉浸式编程学习 最近在开发者社区里,一个名为“VibecodingCurriculum”的项目引起了我的注意。这个由 hashed 团队在 vibedojo 下维护的仓库,名字本身就很有意思——“Vibe Coding”,直译过来是“…...
分布式缓存策略:提升应用性能和可扩展性
分布式缓存策略:提升应用性能和可扩展性 一、分布式缓存概述 1.1 分布式缓存的定义 分布式缓存是一种将数据存储在多个节点上的缓存系统,它通过在内存中存储常用数据,减少对后端数据库的访问,从而提高应用性能和可扩展性。 1.…...
Midjourney生成图落地PS的7大断层痛点:从提示词对齐、分辨率陷阱到图层级精修,一文打通AI与专业图像处理全链路
更多请点击: https://intelliparadigm.com 第一章:Midjourney与Photoshop整合方案的底层逻辑与工作流重构 Midjourney 生成的图像虽具高美学质量,但缺乏图层控制、非破坏性编辑及像素级精度,而 Photoshop 正是弥补这一缺口的核心…...
嵌入式开发十年痛点解析:技术栈、多核与安全的实战解法
1. 从一场会议邀约说起:嵌入式程序员的“午夜惊魂”前几天整理旧资料,翻到了2014年嵌入式系统大会(ESC)编程专题的公开征集帖,发起人是当时ARM的培训经理Chris Shore。帖子标题很有意思,叫“什么让你夜不能…...
DRAM计算内存的电源传输网络优化策略
1. DRAM计算内存中的电源传输网络挑战与优化在数据密集型应用爆炸式增长的今天,传统冯诺依曼架构面临严峻的"内存墙"挑战。计算内存(Compute-in-Memory, CIM)技术通过在内存内部执行计算任务,从根本上改变了数据处理范式…...
OpenSceneGraph 3.6.5 源码编译实战:从依赖配置到项目集成的完整指南
1. 环境准备:搭建编译OSG的基础舞台 在开始编译OpenSceneGraph 3.6.5之前,我们需要先搭建好开发环境。就像盖房子需要打好地基一样,环境配置决定了后续编译过程的顺利程度。我曾在多个项目中编译过不同版本的OSG,发现环境配置不当…...
markdownReader:终极Chrome插件,让本地Markdown文件阅读体验提升300%
markdownReader:终极Chrome插件,让本地Markdown文件阅读体验提升300% 【免费下载链接】markdownReader markdownReader is a extention for chrome, used for reading markdown file. 项目地址: https://gitcode.com/gh_mirrors/ma/markdownReader …...
搜搜果:一种面向AI生成内容验真与品牌可见度监测的实现方案
1. 问题定义 随着大语言模型(LLM)广泛集成到搜索、问答、推荐等场景中,出现两个可观测的问题: 内容可信性问题:模型会以高置信度输出事实上不存在的实体、事件或引用(幻觉,hallucination&#…...
