为什么要安装软件包,而不仅仅是链接到特定环境?

lah*_*suk 7 python pip package-managers conda

我注意到,通常使用各种软件包管理器(对于python)安装软件包时,它们将安装在/home/user/anaconda3/envs/env_name/conda上,并在/home/user/anaconda3/envs/env_name/lib/python3.6/lib-packages/conda上使用pip。

但是conda也会缓存所有最近下载的软件包。

所以,我的问题是:为什么conda不将所有软件包都安装在一个中央位置,然后在特定环境中安装时创建指向目录的链接而不是将其安装在目录中?

我注意到环境变得很大,这种方法可能可以节省一些空间。

mer*_*erv 10

康达已经做到了。但是,由于它利用了硬链接,因此容易高估实际使用的空间,尤其是如果一次仅查看单个环境的大小时。

为了说明这种情况,让我们使用它du来检查实际的磁盘使用情况。首先,如果我分别计算每个环境目录,那么每个环境的使用都会导致未经更正

$ for d in envs/*; do du -sh $d; done
2.4G    envs/pymc36
1.7G    envs/pymc3_27
1.4G    envs/r-keras
1.7G    envs/stan
1.2G    envs/velocyto
Run Code Online (Sandbox Code Playgroud)

从GUI看起来可能是这样。

相反,如果我du将它们一起计算(即,校正硬链接),我们得到

$ du -sh envs/*
2.4G    envs/pymc36
326M    envs/pymc3_27
820M    envs/r-keras
927M    envs/stan
548M    envs/velocyto
Run Code Online (Sandbox Code Playgroud)

可以看到,这里已经节省了大量空间。

大多数硬链接都返回pkgs目录,因此,如果我们也包括该目录:

$ du -sh pkgs envs/*
8.2G    pkgs
400M    envs/pymc36
116M    envs/pymc3_27
 92M    envs/r-keras
 62M    envs/stan
162M    envs/velocyto
Run Code Online (Sandbox Code Playgroud)

可以看到,在共享软件包之外,env相当轻巧。如果您担心my的大小pkgs,请注意,我从未conda clean在此系统上运行,所以我的pkgs目录充满了tarball和被取代的软件包,以及我保留在基础库中的一些基础结构(例如Jupyter,Git等)。

  • 这是一个很好的答案!谢谢,我一直想知道 (2认同)
  • @田当然。这是因为“pkgs”是包代码的中央存储库,大部分硬链接的内容都会返回到那里。所有内容都会首先进入那里,并尽可能链接到环境。 (2认同)