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

conda虚拟环境安装包、依赖同一管理

在 Python 的虚拟环境中,每个环境都是独立的,这意味着即使两个环境需要相同的库,它们也会分别安装各自的副本。这样做是为了避免不同项目之间相互影响,确保每个项目都有一个干净且隔离的环境。

方法一:使用 Conda 的共享环境

当多个上层的虚拟环境在同一时刻调用基础虚拟环境中的 torch 时,通常情况下是不会有问题的,因为每个虚拟环境都是独立的。然而,我们需要明确 conda create --clone 的实际行为以及它是如何工作的。

Conda create --clone 的底层步骤

当你使用 conda create --clone 命令创建一个新的环境时,实际上并不会直接引用底层虚拟环境的依赖包,而是创建了一个与源环境具有相同依赖关系的新环境。具体来说,底层步骤如下:

  1. 解析依赖关系:Conda 会解析源环境中的所有依赖关系及其版本。
  2. 创建新环境:Conda 在指定的目标位置创建一个新的环境目录。
  3. 安装依赖:Conda 会从其包存储库中下载并安装与源环境相同的依赖包及其版本到新环境中。
  4. 保留环境一致性:新环境中的依赖关系、版本和配置与源环境保持一致。

这意味着,尽管新环境与源环境看起来是一样的,但实际上它们是完全独立的,每个环境中的依赖包都是单独安装的。因此,当多个上层环境调用相同的库(如 torch)时,它们实际上各自拥有独立的拷贝,不会互相影响。

步骤:使用 conda create --clone

假设你有一个基础环境 shared_env,其中已经安装了 torchcudatensorflow

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

注意事项

  1. 路径正确性:确保在 environment.yml 文件中提供的本地路径是正确的,并且文件确实存在于指定位置。
  2. 依赖关系:使用 --use-local 时,Conda 会尝试从本地已下载的包中找到匹配的包。如果本地没有匹配的版本,Conda 会从远程仓库下载缺失的包。
  3. 版本兼容性:确保所使用的本地包版本与其他依赖项兼容。如果不兼容,Conda 可能会下载其他版本的包来满足依赖关系。

总结

通过这种方法,你可以利用已下载的本地包来创建新的环境,并且可以在 environment.yml 文件中灵活地指定本地路径。这种方法适用于已经下载了所有需要的包,并且希望在创建新环境时尽量使用这些本地包的情况。

总结

通过这种方法,你可以利用已下载的本地包来创建新的环境,并且简化了从 requirements.txt 文件创建环境的过程。这种方法适用于已经下载了所有需要的包,并且希望在创建新环境时尽量使用这些本地包的情况。

http://www.lryc.cn/news/449735.html

相关文章:

  • Unity网络开发记录(四):在unity中进一步封装客户端类
  • Linux内核中的UART驱动-详解Linux内核UART驱动:结构与功能分析
  • 威胁检测与防范:如何及时、准确对抗安全风险
  • 数据结构串的kmp相关(求next和nextval)
  • 创建游戏暂停菜单
  • seata服务端部署
  • 理解Python闭包概念
  • 51单片机的教室智能照明系统【proteus仿真+程序+报告+原理图+演示视频】
  • 一款资产进行快速存活验证工具
  • I/O中断处理过程
  • 关于PHP 匿名函数在处理数据结构中的应用
  • 安卓13默认使用大鼠标 与配置分析 andriod13默认使用大鼠标 与配置分析
  • AI学习指南深度学习篇-批标准化在深度学习中的应用
  • 了解网络的相关信息
  • Java | Leetcode Java题解之第447题回旋镖的数量
  • Docker实践与应用举例
  • 828华为云征文 | 智能监控新篇章,Prometheus如何在华为云Flexusx容器环境中大展身手
  • 基于单片机的可调式中文电子日历系统
  • 《C++设计新思维-泛型编程与设计模式之应用》阅读记录
  • vue访问组件的数据和方法
  • Redis: RDB与AOF的选择和容灾备份以及Redis数据持久化的优化方案
  • Goweb---Gorm操作数据库(二)
  • 鸿蒙HarmonyOS之封装Http请求工具类
  • java基础(4)类和对象
  • [Linux]:线程(二)
  • 【unity进阶知识3】封装一个事件管理系统
  • 服务器使用frp做内网穿透详细教程,请码住
  • 小程序视频编辑SDK解决方案,轻量化视频制作解决方案
  • ERROR [internal] load metadata for docker.io/library/openjdk:8
  • Wed前端--HTML基础