6

我很高兴通过miniconda安装使用Conda来管理 python 环境。

安装后,我不理会base环境并为新项目创建新环境。然后我conda env update根据需要这些环境。但是,我不确定这是正确的方法。

在创建新环境之前应该编辑环境base吗?conda env update

认为这会降低磁盘使用率,因为我可能不正确的理解是,base如果包和依赖项完全匹配,则在创建新环境时,Conda 会将包链接到环境。

虽然......这没有多大意义,因为它们很容易不同步。也许它只是节省带宽,因为可以复制而不是下载匹配的包?

如果每个项目都有自己的环境,那么base环境是否保持最新是否重要?

4

1 回答 1

12

Conda 将所有包链接到该pkgs文件夹​​,该文件夹由所有 env 共享,并且不以任何特殊方式与base关联。每当任何 env 安装或升级包时,它们都会去那里,并且没有任何明确的努力从现有包中获取 - 如果依赖关系求解器碰巧解析为缓存包,它将使用它。目前,没有一种机制可以保持包跨 envs 的同步,因此必须设计一个工作流来实现它。

潜在的工作流程

理论上,可以使用Conda 的 env 克隆来最大化包版本同步。为此,您可以在概念上将您的环境组织为三类:

  • base env:仅用于核心基础架构,例如 、、conda等。您可以在需要新的命令行软件或需要时自由更新。它应该与其他环境几乎没有重叠。jupytergitconda update conda
  • template env : 集中通用包集,通常按版本限制分组。例如,对于不同项目可能需要的不同 Python 版本,可能有一个py27-tmplpy36-tmpl和。py37-tmpl在这里,您将安装跨项目所需的最大通用包子集。模板环境的主要目的是制作...
  • project env:与特定的开发项目相关联,最初是作为模板 env 的克隆派生的。其中大部分核心软件都来自模板,然后这里应该安装额外的软件。一旦你为一个项目启动了一个,你就保持它相对固定,以保持开发的稳定性。

这样的结构将最大限度地重用现有的包版本。从 Conda v4.7 开始,依赖求解器默认为带有隐式--freeze-installed|--no-update-deps标志的第一阶段求解,它尝试安装请求的包而无需更改现有包。如果与模板 env 保持同步是您的目标,那么您可能希望--freeze-installed在安装时始终使用 。也可以使用包固定来明确阻止指定的包从模板升级。但是,这可能会限制安装其他软件包的某些最新版本。

不幸的是,您仍然会遇到与您直觉相似的同步问题:虽然您可以在创建新克隆之前更新这些模板环境,但这不会更新以前从它们派生的环境。但是对于项目环境,我认为最好的做法是一旦开始工作就不要操纵它们。如果您关心空间,那么没有什么可以替代完成您的模块化项目,然后在使用后归档和删除项目环境。那个,偶尔跑conda clean

于 2019-05-21T14:24:22.920 回答