如何在conda虚拟环境中卸载所有未使用的软件包?

61

我有一个conda虚拟环境,里面安装了一些未使用的包(可能是用pip installconda install安装的)。

最简单的方法是什么,可以清理掉未被我的代码实际使用的包,只保留用到的包?


9
您可能需要查看conda clean --packages。特别是,您可以先使用“干运行”设置尝试它--也就是conda clean --packages --dry-run。我认为它仅寻找未在任何conda环境中使用的软件包。因此,它不会检查您是否在代码本身中使用它,但它可能很有用。 - Paul
3个回答

66
conda clean --yes --all

会对所有内容进行清理。但请注意:如果您想进行任何类型的--offline操作,请不要使用--all;应更加有选择性。


37
这并不会卸载软件包,它只是删除已下载的软件包文件。 - Spirko
3
你知道 conda clean --yes --packagesconda clean --all 有什么区别吗?有趣的是,对我来说,--packages 选项找到的数据是 --all 的两倍。 - Agile Bean
2
@敏捷豆conda clean --yes --all 和 conda clean --yes --packages 的区别在于,packages 只是提取的文件夹。所有其他文件(.tar.bz2、.conda,即 tarballs)都不会被 --packages 清理。如果您只想清理 tarballs,则需要使用 conda clean --yes --tarballs。参考资料: https://dev59.com/WVcP5IYBdhLWcg3wN3qP - questionto42
3
@Lorenz 感谢您的澄清!那我就想知道为什么 --packages 找到的文件比 --all 还要多... - Agile Bean
@AgileBean 我添加了一个单独的答案。 - questionto42
我曾经运行过conda clean --all,现在在一些软件包的--offline安装中遇到了问题/损坏,尽管进行了全新安装。请您解释一下:a) 为什么--all对于--offline是有问题的,b) 如何修复这个情况? - mara004

27

@AgileBean,我尝试回答你在评论中关于为什么--packages--all给出更多结果的问题。这仍然与主要问题如何卸载相关,希望能有所帮助。

区别在于:

    conda clean --yes --all

以及

    conda clean --yes --packages

这意味着包仅是提取的文件夹。所有其他文件(.tar.bz2, .conda,即tarballs)都不会被--packages清理。

如果要仅清理tarballs,则需要:

    conda clean --yes --tarballs

参考文献: Anaconda Python: Delete .tar.gz in pkgs

这是差异的一个示例。请注意,在实际运行中,--all包括--packages,但在dry-run中不显示--packages结果(非常奇怪!参见以下截图,它只停留在)

conda clean --all --dry-run vs. conda clean --packages --dry-run

有哪些差异可以解释为什么您使用--packages--all找到更多内容?

  1. 正如之前所说,我第一次猜测你只使用了dry-run选项,这将不会在运行conda clean --all --dry-run时展示已清理的--packages。因此,请看来自conda clean --all的这个真正运行:

    conda clean --all

  2. 这两个警告可能很有趣:

    WARNING: C:\Users\Admin\.conda\pkgs does not exist                                                                                                                                           
    WARNING: C:\Users\Admin\AppData\Local\conda\conda\pkgs does not exist
    

    但如果你不运行干预模式,而是真正运行--all,你会得到相同的结果,因为--all包括--packages,因此也包括它的警告。当使用干预模式时,这一点是看不到的。

  3. 一个很好的原因可能是你曾经用--tarballs清理过你的软件包,或者你已经手动删除了一些tarball文件,所以在--dry-run中,未解压的软件包数量超过了tarballs的数量。

  4. 你可能已经手动解压了许多软件包到缓存文件夹中,例如从git进行的手动安装以及所有其他不提供conda / pip安装的安装,然后在--dry-run中,--all不会显示--packages

  5. 可能你能在文档中找到另一个答案?https://docs.conda.io/projects/conda/en/latest/commands/clean.html。它关于符号链接说:“WARNING: This does not check for packages installed using symlinks back to the package cache.”因为--packages--all的一部分,所以这仍然不能解释你的差异。

我猜你--packages > --all的问题是因为conda clean --all --dry-run不会显示--packages的结果,尽管它也会清理它们,所以你实际上并没有这个问题 ;)。


6
值得一提的是,我注意到以下内容...
  • conda clean --all --dry-run 显示总共约为 2GB 的数据
  • conda clean --packages --dry-run 显示总共约为 6GB 的数据
所以和楼主观察到的情况一样...
当我接下来运行 conda clean --tarballs --dry-run 命令时,它也显示了 2GB,很奇怪...比较第一个和最后一个命令的输出,似乎 conda clean --all --dry-run 只显示了 tarballs,没有提到 packages。
我继续进行了操作,执行了 conda clean --tarballs 然后重新运行了 conda clean --all --dry-run...你猜怎么着?现在它显示了 packages(在提到没有 tarballs 后,这是合理的,因为我刚刚清理了它们)
我的结论是:当缓存中仍存在 tarballs 时,conda clean --all --dry-run 不会给出完整的将要/可能被删除的信息。

我在Windows上的Conda环境(使用Anaconda prompt)中运行相同的操作。"conda clean --all --dry-run"也会列出未使用的包。(mycondaenv) C:\myrepo>conda clean --packages --dry-run 将删除 685(9.45 GB)个软件包。DryRunExit:干运行。退出。(mycondaenv) C:\myrepo>conda clean --all --dry-run 将删除 922(2.65 GB)个压缩包。 将删除 1 个索引缓存。 将删除 685(9.45 GB)个软件包。 没有任何临时文件需要删除。 没有任何日志文件需要删除。DryRunExit:干运行。退出。 - learningstack
@learningstack 嗯...奇怪...受到你的评论的启发,我再次测试了一下,据我所见,我仍然得到相同的行为:如果有tarballs,则conda clean --all --dry-run不会提及可以清理的软件包...晕头转向...你用的是哪个conda版本?(这里是v4.12) - kochuyt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接