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

Python 为什么要安装软件包而不仅仅是链接到特定环境?,python,pip,conda,package-managers,Python,Pip,Conda,Package Managers,我注意到,通常情况下,当使用各种包管理器(对于python)安装包时,它们安装在conda上的/home/user/anaconda3/envs/env_name/和conda上使用pip的/home/user/anaconda3/env_name/lib/python3.6/lib packages/中 但是康达也会缓存所有最近下载的软件包 所以,我的问题是: 为什么conda不将所有软件包安装在中心位置,然后在特定环境中安装时创建指向目录的链接,而不是安装在那里 我注意到环境变得相当大,这种

我注意到,通常情况下,当使用各种包管理器(对于python)安装包时,它们安装在conda上的
/home/user/anaconda3/envs/env_name/
和conda上使用pip的
/home/user/anaconda3/env_name/lib/python3.6/lib packages/

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

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


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

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

为了说明这种情况,让我们使用
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
这就是它在GUI中的外观

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

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

大多数硬链接都返回到
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

可以看到,在共享包之外,环境相当轻。如果您关心我的
pkgs
的大小,请注意,我从未在此系统上运行过
conda clean
,因此我的
pkgs
目录中充满了tarball和被取代的包,以及我保存在base中的一些基础设施(例如,Jupyter、Git等).

我可以问一下,为什么在加入
pkg
之前和之后,您的环境大小会发生变化?@Tian当然可以。这是因为,
pkgs
是包代码的中央存储库,很多硬链接的内容都可以回到那里。所有内容都首先进入其中,并尽可能链接到环境。@merv对我来说,
对于环境中的d/*;do du-sh$d;完成
du-sh env/*
显示相同的结果…(它们都显示每个env有3~5GB)为什么会这样?这是否意味着它从不使用硬链接的东西?(我使用的是
miniconda
conda
版本是
4.8.3
)@user3595632。包缓存是否位于不同的文件系统上?例如,检查
conda config-show pkgs\u dirs envs\u dirs
。或者还有其他与链接行为相关的配置设置值得检查。
$ du -sh pkgs envs/*
8.2G    pkgs
400M    envs/pymc36
116M    envs/pymc3_27
 92M    envs/r-keras
 62M    envs/stan
162M    envs/velocyto