python - 为什么要安装包而不是仅链接到特定环境?

标签 python pip conda package-managers

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

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

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

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

最佳答案

Conda 已经这样做了。但是,因为它利用了硬链接(hard link),所以很容易高估实际使用的空间,特别是如果一次只查看单个环境的大小。

为了说明这个案例,让我们使用 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 将它们一起计算(即纠正硬链接(hard link)),我们会得到

$ du -sh envs/*
2.4G    envs/pymc36
326M    envs/pymc3_27
820M    envs/r-keras
927M    envs/stan
548M    envs/velocyto

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

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

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

关于python - 为什么要安装包而不是仅链接到特定环境?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55566419/

相关文章:

python - 如何将非 Python 包 (.tar.bz2) 安装/转换为 Anaconda 包?

bash - 应该在 .bash_profile 文件中更改什么才能完全删除/卸载 Conda/Anaconda?

python - 将计算值缓存为 TensorFlow 中的常量

python - 将连续的 GPS 数据拆分为单独的旅程

python - pip 抛出 TypeError : parse() got an unexpected keyword argument 'transport_encoding' when trying to install new packages

ms-word - 尝试在Python中导入docx

python - 为什么conda在激活另一个环境后重新定义基础环境?

python - Pandas 在两个数字之间填充 nan

python - 使用特定标志时如何允许省略必需的参数?

python - 将 PIP_EXTRA_INDEX_URL 传递给 docker build