比较两个Anaconda安装包之间的差异

11

我在我的Mac上安装了Anaconda,并安装了两个版本的Python:3.5和3.7。有没有办法知道我在3.5中安装了哪些包,而在3.7中没有,例如那些可以用pip安装的包(如pulp,wordcloud等)。

到目前为止,我尝试使用命令行:

diff -rq anaconda/.../python3.5/site-packages anaconda3/.../python3.7/site-packages

这显示了目录之间的差异,但显示了许多重复软件包和核心模块的信息。我该如何在两个Anaconda版本之间找到软件包的差异?

这展示了目录间的区别,但显示了很多重复的软件包和核心模块信息。如何查找两个Anaconda版本之间软件包的差异?

你可以使用 pip3.5 listpip3.7 list 命令,然后比较它们的输出。 - Mowshon
谢谢 @Mowshon,这确实有帮助。还有什么想法可以过滤掉重复的软件包,比如astropy或conda? - Ivan Calderon
6个回答

13

您可以使用conda list列出特定环境下安装的所有软件包。此外,您可以使用标志--export将列表导出到文件中。例如,如果您的环境名为python3pytorch_p36,则可以执行以下操作:

conda list -n python3 --export > python3-packages.txt
conda list -n pytorch_p36 --export > pytorch_p36-packages.txt
diff python3-packages.txt pytorch_p36-packages.txt

该命令还接受标志--json,可以将数据以json格式导出,适用于自动处理。


嘿,@Julian Peller 谢谢您的回复。我尝试了,但遇到了其他问题。我不知道如何指定环境名称。我使用 conda info --envs 查找它们。它显示其中一个称为 /anaconda3,另一个为 //anaconda。因此,当我键入 conda list -n anaconda 时,会显示错误,告诉我没有这样的环境。如果您能给我任何提示,我将非常感激。 - Ivan Calderon
@julian peller 激活一个环境 conda activate myenv,然后你就可以获取与该环境相关的信息。 - agent18

5

感谢Dataista提供的Linux解决方案。对于Windows, diff命令不起作用,但可以使用FC命令:

conda list -n python3 --export > python3-packages.txt
conda list -n pytorch_p36 --export > pytorch_p36-packages.txt
FC python3-packages.txt pytorch_p36-packages.txt

4

使用新的compare命令,通过mini conda 4.11,我将比较一个已命名的环境和一个路径环境。

 conda --version
conda 4.11.0

首先列出我拥有的环境

❯ conda env list
# conda environments:
#
base                  *  /Users/me/miniforge3
experiments              /Users/me/miniforge3/envs/experiments
tfm1                     /Users/me/miniforge3/envs/tfm1
                         /Users/me/path/project/env

现在我想比较位于目录./path/project/env下的conda环境与名为tfm1(我的tensorflow环境)的环境… 首先,我切换到tfm1环境并导出其包列表:

❯ conda activate tfm1
❯ conda env export -f /Users/me/path/tfm1_env.yml

接下来我切换到另一个环境,在该目录下:

❯ conda activate /Users/me/path/project/env

最后使用新的比较命令:

❯ conda compare /Users/me/path/tfm1_env.yml

black not found
certifi found but mismatch. Specification pkg: certifi==2021.10.8=py38h10201cd_1, Running pkg: certifi==2021.10.8=pypi_0
click not found
dataclasses not found
executing found but mismatch. Specification pkg: executing==0.8.2=pyhd8ed1ab_0, Running pkg: executing==0.8.3=pyhd8ed1ab_0
flit-core found but mismatch. Specification pkg: flit-core==3.6.0=pyhd8ed1ab_0, Running pkg: flit-core==3.7.1=pyhd8ed1ab_0
fonttools found but mismatch. Specification pkg: fonttools==4.29.1=py38hea4295b_0, Running pkg: fonttools==4.31.2=py38h33210d7_0
fribidi not found
...

文档对此并不太清楚,但是“规范包”是指在环境中找到的一个包,我们将其导出到文件中的“规范”(例如我的示例中的“tfm1”)。当然,“运行包”就是我激活的那个包。
更不清楚的是,“未找到”是指活动环境:例如,“black”、“fribidi”等包在我的tfm1(指定)中,但不在我的项目/ env(活动)环境中。

感谢您告诉我有关新的conda“compare”命令的信息。我正要写自己的。还有一个用于比较多种类型环境的包,叫做“pyenvdiff”,可以在https://pyenvdiff.readthedocs.io/en/latest/readme.html找到。 - Rich Lysakowski PhD

1
最近的更新现在提供了将conda环境与要求文件进行比较的功能。到目前为止,我找到的唯一提及这一点的地方是在2020年7月16日合并的拉取请求中。我可以验证,在conda版本4.8.4中,compare 命令有效。值得注意的是,输出中仅列出差异。

使用方法:
(ProcMCD43A1) C:\Users\justincase>conda compare environment.yml --json
[
  "argon2-cffi found but mismatch. Specification pkg: argon2-cffi==20.1.0=py37he774522_1, Running pkg: argon2-cffi==20.1.0=py37h4ab8f01_1",
  "attrs found but mismatch. Specification pkg: attrs==19.3.0=py_0, Running pkg: attrs==20.2.0=pyh9f0ad1d_0",
  "backcall found but mismatch. Specification pkg: backcall==0.2.0=py_0, Running pkg: backcall==0.2.0=pyh9f0ad1d_0",
  "bleach found but mismatch. Specification pkg: bleach==3.1.5=py_0, Running pkg: bleach==3.2.0=pyh9f0ad1d_0",
  "brotlipy found but mismatch. Specification pkg: brotlipy==0.7.0=py37he774522_1000, Running pkg: brotlipy==0.7.0=py37h4ab8f01_1000",
  "bzip2 found but mismatch. Specification pkg: bzip2==1.0.8=he774522_0, Running pkg: bzip2==1.0.8=he774522_3",
  "cffi found but mismatch. Specification pkg: cffi==1.14.0=py37h7a1dbc1_0, Running pkg: cffi==1.14.3=py37h26f1ce3_0",
  "cfitsio found but mismatch. Specification pkg: cfitsio==3.470=he774522_5, Running pkg: cfitsio==3.470=hbbe6aef_6",
  "cftime found but mismatch. Specification pkg: cftime==1.2.1=py37h2a96729_0, Running pkg: cftime==1.2.1=py37h44b1f71_0",
  "chardet found but mismatch. Specification pkg: chardet==3.0.4=py37_1003, Running pkg: chardet==3.0.4=py37hc8dfbb8_1006",
  "click not found",
  "click-plugins not found",
  "cligj not found",
  "cryptography found but mismatch. Specification pkg: cryptography==2.9.2=py37h7a1dbc1_0, Running pkg: cryptography==3.1=py37h26f1ce3_0",
  "curl found but mismatch. Specification pkg: curl==7.67.0=h2a8f88b_0, Running pkg: curl==7.71.1=h4b64cdc_5",
  "cycler found but mismatch. Specification pkg: cycler==0.10.0=py37_0, Running pkg: cycler==0.10.0=py_2",
  "descartes not found",
  "entrypoints found but mismatch. Specification pkg: entrypoints==0.3=py37_0, Running pkg: entrypoints==0.3=py37hc8dfbb8_1001",
  "fiona not found",
  "freexl found but mismatch. Specification pkg: freexl==1.0.5=hfa6e2cd_0, Running pkg: freexl==1.0.5=hd288d7e_1002",
  "gdal found but mismatch. Specification pkg: gdal==3.0.2=py37hdf43c64_0, Running pkg: gdal==3.1.2=py37h6ddc196_1",
  "geopandas not found",
  "geos found but mismatch. Specification pkg: geos==3.8.0=h33f27b4_0, Running pkg: geos==3.8.1=he025d50_0",
  "geotiff found but mismatch. Specification pkg: geotiff==1.5.1=h5770a2b_1, Running pkg: geotiff==1.6.0=h09e6dc1_1",
  "h5py not found",
  "hdf4 found but mismatch. Specification pkg: hdf4==4.2.13=h712560f_2, Running pkg: hdf4==4.2.13=hf8e6fe8_1003",
  "hdf5 found but mismatch. Specification pkg: hdf5==1.10.4=h7ebc959_0, Running pkg: hdf5==1.10.6=nompi_he0bbb20_101",
   ...
]

0
多年前我写了一个名为conda-env-compare.pl的脚本,用于比较conda环境并将相同和不同之处打印出来。最近我对它进行了测试,似乎仍然可以正常工作。以下是它产生的输出示例:

conda env comparison example


https://meta.stackoverflow.com/a/285557/11107541 - undefined

0

还可以查看pyenvdiff中的pyenvdiff包。

相当讽刺的是,pyenvdiff目前还没有conda包。有人愿意为pyenvdiff创建并提交一个conda-forge配方吗?


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