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
标志来仅使用包缓存。
我们保留了 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
标志来仅使用包缓存。