conda 从环境文件创建与 conda 克隆

conda create from environment file vs. conda clone

我们保留了 conda 环境的旧实例,以便人们可以克隆它们。

我注意到当我使用 conda create --clone 时,包仍然被下载而不是被复制。

因此我想知道只保留导出的 environment.yaml 文件是否具有相同的效果。

基本上,问题是,以下两种情况有何不同(如果有的话)?

conda activate old_env
conda env export > env.yml
conda create -n new_env -f env.yml

conda create -n new_env --clone /path/to/old_env

我看过 conda source code here 但我对代码库不够熟悉,无法理解发生了什么。

不同之处在于您不能在不同的计算机上克隆一个环境,但您可以轻松地在全球范围内发送一个 yaml 文件,然后在另一台计算机上复制您的环境。

但是,conda 将所有下载的包缓存在 pkgs 文件夹中,然后将它们(尽可能)硬链接到环境以节省磁盘 space。这与您在克隆过程中观察到的情况有些矛盾。可能它只是在提取 “正在下载和提取包”

手头没有现成的全面答案,但我注意到两个不同之处:

  • 克隆会复制所有未跟踪的文件。虽然 conda-env 将检测 PyPI 包并将它们包含在 YAML 中,但 conda create --clone 将检测 任何 个非 Conda 文件并复制它们。如果不通过 Conda 或 Pip 将其他软件安装到环境中,这可能很有用。例如,一个 R env,其中可能使用 devtools::install_github() 而不是 Conda 从 GitHub 安装了一些东西。所以克隆可以维持定制的环境。
  • 在新环境中显式规范存在细微差别。这有点微不足道,但克隆将包括源通道和子目录明确的规范,而 YAML 不会(除非最初包含)。例如,new 环境中的 运行 conda env export 将为 YAML 创建的环境提供类似 numpy=1.20.1=py39h3c955ea_0 的内容,为克隆环境提供 conda-forge/osx-64::numpy==1.20.1=py39h3c955ea_0 .这主要是无关紧要的,因为构建字符串本身(这里 py39h3c955ea_0)几乎总是足够独特以辨别来源频道。

我不确定您为什么会看到重新下载。这可能对用户是否有共享包缓存 (pkgs_dirs) 或用户清理包缓存 (conda clean -tp) 的副作用敏感。在我刚刚做的一个测试用例中,有一些重新下载的包,但只是一个子集。请注意,您也可以尝试使用 --offline 标志来仅使用包缓存。