python环境部署(二) —— conda环境迁移

2023-05-16

前言

在《python环境部署(一) —— pip依赖迁移》中,我介绍了纯粹使用pip安装python模块的情况下如何进行依赖的迁移。没有看过的读者建议先看一看。
本文,我将继续介绍如何在使用conda的情况下进行环境的迁移。

同样不可靠的方法

conda与pip一样提供了导出依赖的方法:

conda list -e > requirements.txt

文件格式如下:

<package>=<version>=<build>

与pip导出的文件略有不同。
在待部署机器上,可以使用以下命令安装依赖以恢复依赖环境:

conda create --name <env> --file requirements.txt

此外,由于conda提供了虚拟环境导出的功能,可以按以下步骤复制一个环境:
首先,用以下命令导出一个environment.yml文件:

conda env export -f environment.yml

然后使用以下命令重建虚拟环境:

conda env create -f environment.yml

与pip相同,以上两种方法也存在一些问题。下面我仔细解释。

同样的问题:找不到匹配的包

使用requirements.txt安装同样存在找不到包的问题(PackagesNotFoundError):
conda找不到适配的包
造成这个现象,有与pip同样的原因——镜像源的更新,还有一个特殊的情况,那就是上图中无法匹配到的那些包,如果背后是pypi_0的,说明是通过pip安装的,这些包在使用requirements.txt文件安装时是不会得到conda支持的,因为他们是通过pip安装的。换言之,通过conda list导出的requirements.txt文件既包括conda安装的包,也包括pip安装的包,这些通过pip安装的包无法通过conda来安装。这其中原因包括:
1)命名规则的不同,
2)开发者数量的不对等(因此有些包conda上确实没有),
3)编译系统的差异导致版本号不对应,
4)并不是通过pypi安装的包等。
这些能够造成确实无法找到适配的包,但是更关键的还是多出了那pypi_0的后缀,这就导致了实际上很多包应该是匹配的,但是却搜索不到,因为找不到pypi_0这个Build名。

对待由于镜像源更新造成的找不到包的问题,不重要的包可以做升级,重要的包则需要单独考虑了。
批量更新conda的包可以使用:

conda update --all

在我更新conda安装的包并重新导出requirements.txt(先排除非pypi_0结尾的那些包)文件进行安装后,有63个通过pip安装的包无法匹配到:
在这里插入图片描述
在VSCode中,用空字符替换“=pypi_0”:
在这里插入图片描述
再进行一次安装尝试,则只剩下14个再conda源中确实无法搜索到的包了。
在这里插入图片描述
而如果我们使用conda env导出的environment.yml文件,则可以避开这个问题。在这个文件中,分别记录了使用pip安装的包和从conda的源中安装的包:
在这里插入图片描述
conda在处理这些pip安装的包时,将会转而采用pip来处理:
在这里插入图片描述
所以我给出的建议是,要解决这个问题,就直接不使用conda list导出requirements.txt这个方法,仍然使用pip导出requirements.txt文件,按照《python环境部署(一) —— pip依赖迁移》中所述的方法进行处理。对于conda安装的那一部分,导出environm.yml文件,删除其中pip部分,并使用下面介绍的方法处理。

离线部署

在《python环境部署(一) —— pip依赖迁移》中已经明确了,实现离线部署才是最终的目的。

对于conda,看到一些教程介绍一个简单粗暴的方法,就是一股脑把虚拟环境目录复制下来(在conda主目录的envs目录下),然后拷贝到待部署机器上。这么做有一个非常糟糕的问题,就是prefix绝对目录的问题。在环境目录下用grep搜索一下,就可以发现,有大量文件内嵌了绝对目录,这在部署机器上是无法正常工作的,除非你能做到两台机器完全对等,连用户名都一样,这显然是不现实的。

可以用sed命令替换prefix,或者使用conda-pack这个模块:

# 安装(测试机器和待部署机器上都需要安装,建议在base环境安装)
conda install -c conda-forge conda-pack
# 测试机器上导出环境【注1】
conda pack -n my_env -o out_name.tar.gz
# 待部署机器上导入环境
mkdir -p my_env
tar -xzvf out_name.tar.gz -C my_env
# 待部署机器上激活环境(这条命令会将my_env/bin添加到path环境变量,之后方可支持conda activate)
source my_env/bin/activate
# 待部署机器上替换prefix
conda-unpack

【注1】:此时如遇“Files managed by conda were found to have been deleted/overwritten …”的问题,则应该是在使用过程中误用pip卸载了用conda安装的包,此时首先需要用conda正确卸载这些包,然后再执行打包的操作。

跨平台部署

对于跨平台部署,同样建议在真实的机器或者虚拟机中测试好以后再按以上离线部署方法去部署。这里介绍一下如何减少其中的工作量。
environment.yml中dependencies格式如下:

- <package>=<version>=<build>

其实package和version对于不同平台来说基本都是一样的,区别就在于build。conda根据不同平台构建二进制包时,就会产生有不同的build。据此,如果删除了build这个字段后,就可以匹配绝大多数的包。
在VSCode中用以下正则表达式匹配这个字段并用空字符替换:
在这里插入图片描述
这样一来,就只会有少数包无法正常被搜索到,再进行个别的安装即可。

关于其他工具的说明

(1)conda create --clone
conda create --clone命令亦可用于环境复制/迁移,但实测中却发现仍然会在源上搜索包进行安装,也无法限制其不去搜索源(开启–offline亦不生效),我不确定这是不是bug,总之我不用它:

conda create --offline --name [dest_venv_name]  --clone [src_venv_name] 

(2)搭建本地源
conda也可以搭建本地源来实现离线部署,但遗憾的是,我在conda 4.5.12上尝试的很多命令都无法生效(例如–offline、–download-only),我在help信息中确认过,语法上并没有问题,使我对其失去了兴趣,没有再折腾下去。所以,就到这里吧。有兴趣的就自己了解下吧。
https://blog.csdn.net/haveanybody/article/details/84025759

(2)conda-bundle
conda也有一些人编写了类似于pip-bundle的工具,叫做conda-bundle,感兴趣的可以看看。
https://github.com/minrk/conda-bundle

参考文献

https://conda.github.io/conda-pack/
https://blog.csdn.net/haveanybody/article/details/84025759
https://github.com/minrk/conda-bundle

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python环境部署(二) —— conda环境迁移 的相关文章

  • gnome manjaro设置无法打开

    本文转载自 xff1a https joshtronic com 2018 04 02 unable to open gnome settings on arch linux after gnome upgrade 我经常会写关于主题的博客
  • 手动将经典 VM 从 VHD 迁移到新的 ARM 托管磁盘 VM

    本部分有助于将现有 Azure VM 从经典部署模型迁移到资源管理器部署模型中的托管磁盘 计划迁移到托管磁盘 本部分可帮助你针对 VM 和磁盘类型做出最佳决策 位置 选取 Azure 托管磁盘可用位置 如果要迁移到高级托管磁盘 xff0c
  • 适用于 Azure 虚拟网络的常见 PowerShell 命令

    如果想要创建虚拟机 xff0c 需要创建虚拟网络或了解可在其中添加 VM 的现有虚拟网络 通常情况下 xff0c 创建 VM 时 xff0c 还需考虑创建本文所述资源 有关安装最新版 Azure PowerShell 选择订阅和登录到帐户的
  • 创建包含多个子网的虚拟网络

    本教程介绍如何创建包含独立公共子网和专用子网的基本 Azure 虚拟网络 虚拟网络中的资源可以彼此通信 xff0c 并可以与连接到虚拟网络的其他网络中的资源通信 可在虚拟网络中相同或不同的子网中创建 Azure 资源 xff0c 如虚拟机
  • matplotlib笔记

    文章目录 matplotlib笔记cmap选择cmap创建cmap 子图断点轴 Broken axis 子图大小 坐标轴scale matplotlib笔记 有一个在线使用matplotlib的网址 cmap 选择cmap choose c
  • Fortran pgplot安装

    pgplot 首先确保已经安装了gfortran 以下为linux下安装流程 从这里下载安装包解压tar zxvf pgplot5 2 tar gz到某个目录比如 src pgplot创建一个文件夹xxx pgplot用于安装 xff0c
  • CUDA和Compute Capability

    CUDA Enabled GPUs Cuda支持的GPU 在这个参考包含了GPU的Compute Capacity列表 比如我的笔记本搭载了一块Geforce830m xff0c 查询列表就可以发现如下图 那么这块830M GPU的Comp
  • Javascript笔记

    数据类型 基本类型 primitive value 简单的数据段 xff0c 包括 Undefined Null Boolean Number String初始化只使用2原始字面量形式 xff0c 如果使用new则会创建Object无法加入
  • 前端面试题笔记

    前端面试八股 发现了一个地方包含了很多前端面试八股 1 用户喜好 为了不断优化推荐效果 xff0c 今日头条每天要存储和处理海量数据 假设有这样一种场景 xff1a 我们对用户按照它们的注册时间先后来标号 xff0c 对于一类文章 xff0
  • Matlab:数据写入Excel

    使用xlswrite 可以help xlswrite查看用法 xlswrite filename A xlswrite filename A sheet xlswrite filename A xlRange xlswrite filena
  • python处理FITS 1:astropy介绍与安装

    1 1介绍 astropy是一个开源的python库 xff0c 专门用于处理天文方面的数据 astropy包是Astropy 项目的内核 xff0c 这个项目致力于发展一个鲁棒性较好的伴随子包 xff08 能兼容优秀的astropy这个库
  • 使用sublime编译运行C程序

    1 打开sublime xff0c 找到顶部工具 xff08 Tool xff09 菜单 gt 编译系统 xff08 Build System xff09 gt 新编译系统 xff08 New Build System xff09 xff1
  • python处理FITS文件 2:astropy.io.fits介绍及打开FITS文件

    astropy这个库有很多功能 xff0c 因为本文主要涉及FITS文件 xff0c 因此仅仅使用astropy io fits 1介绍 astropy io fits包提供FITS文件操作的函数接口 xff0c 使得用户可以忽略FITS文
  • python处理FITS 3:处理头文件和数据单元

    1头文件处理 在获得hdul后 xff0c 可以使用两个属性 header data分别获得头文件和数据单元 gt gt gt hdul 61 fits span class hljs built in open span fits ima
  • Django使用pip安装

    1 pip安装 pip是python的包管理器 xff0c 使用这个工具可以很轻松安装各种python库 直接运行 pip install django 然后就可以安装了 1 1安装问题 输入 pip install django 报错 x
  • 内网穿透方式

    ssh 内网中的机器A 需要访问内网中的c 64 C 公网中的机器B xff0c 用户名b 内网中的机器A ssh CNR 7280 C 22 b 64 B 公网中的机器B ssh fCNL 7279 localhost 7280 loca
  • vue笔记

    rollup 专注于JavaScript打包不包含无关代码 对比webpack tree shaking 最开始由rollup实现 xff0c 之后被webpack借鉴配置output format xff0c 选择输出资源的模块形式 xf
  • geant4学习

    文章目录 配置vscode configuration materialgeant4的类及成员函数physicsList选择构建Physics List 粒子粒子类型能量损失重子和离子 杂项getEnergyoptical photon的速
  • C++枚举与字符串转换工具类

    C 43 43 枚举与字符串转换工具类 最近需要一个能够在字符串和枚举值之间互相转换的功能 xff0c 因为C 43 43 没有对枚举值进行遍历 反射之类的操作 xff0c 不像Java那样可以轻松搞定 网上找到一些代码感觉用起来有点不爽
  • iOS 使用xmpp做聊天客户端

    可以号称史上最详细的xmpp做iOS客户端聊天介绍 简介 xff1a XMPP协议是一种基于Socket长连接 以XML格式进行基本信息交换 C S S S多种架构的聊天协议 XMPPServer 基于XMPP协议的服务端 例如eJabbe

随机推荐