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

news/2024/12/21 2:38:40/

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

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

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

Conda create --clone 的底层步骤

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

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

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

conda_create_clone_18">步骤:使用 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.ppmy.cn/news/1534032.html

相关文章

Docker 进入容器运行命令的详细指南

Docker 进入容器运行命令的详细指南 Docker 是一个开源的容器化平台&#xff0c;广泛应用于开发和生产环境中。它允许开发者打包应用程序及其依赖项到容器中&#xff0c;并能够在不同的平台上快速部署和运行。容器通常是独立且隔离的&#xff0c;但在开发、调试或维护过程中&a…

STM32自动下载电路分享及注意事项

文章目录 简介ISP下载启动配置 USB转串口芯片CH340C手动isp下载自动isp下载RTS、DTR电平变化分析注意事项 简介 在嵌入式开发中&#xff0c;使用STM32下载程序&#xff0c;可以通过仿真器下载&#xff0c;也可以通过串口下载。在stm32串口下载时&#xff0c;我们需要手动配置启…

加密与安全_TOTP 一次性密码生成算法

文章目录 PreTOTP是什么TOTP 算法工作原理TOTP 生成公式TOTP 与 HOTP 的对比Code生成TOTP验证 TOTP使用场景小结 TOTP 与 HOTP 的主要区别TOTP 与 HOTP应用场景比较TOTP 与 HOTP安全性分析 Pre 加密与安全_HTOP 一次性密码生成算法 https://github.com/samdjstevens/java-tot…

计算机毕业设计 基于Python的无人超市管理系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

CSP-JS 复赛复习 习题记录——字符串(东方博宜OJ)

家人们&#xff0c;这不要考CSP复赛了嘛&#xff0c;就做了几个复习题单&#xff0c;和大家分享分享&#xff0c;也就随便做做&#xff0c; 望大家多多关照&#xff01; 网址&#xff1a;东方博宜OJ - 字符串 题单 食用说明&#xff1a;这次的题 太简单了 还不算太难&#xff0…

MySQL安全加固

MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策&#xff0c;分为社区版和商业版&#xff0c;由于其体积小、速度快、总体拥有成本低&#xff0c;尤其是开放源码这一特点&#xff0c;一般中小型网站的开发都选择 MySQL 作为网站数据库。…

【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现

高阶数据结构相关知识点可以通过点击以下链接进行学习一起加油&#xff01; 本章是高阶数据结构笔记的第一篇文章&#xff0c;将分享二叉搜索树的进阶概念及其高效实现的相关知识&#xff0c;欢迎大家阅读&#xff01; &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f3…

检查cuda和显卡的可用性

检查cuda和显卡的可用性 import torch device_gpu torch.device(cuda if torch.cuda.is_available() else cpu) print(device_gpu) print(torch.cuda.is_available())