【问题标题】:How to know which packages I istalled myself in conda (and pip)?如何知道我在 conda(和 pip)中安装了哪些软件包?
【发布时间】:2020-09-15 11:49:50
【问题描述】:

在我看来这是一个非常基本的问题,但我没有找到一个直截了当的答案。 我有两台(实际上更多)PC,我在 conda 环境中工作。在某些时候,我想执行重大更新,例如Python 版本。由于 conda 表示许多冲突,我不知道如何处理,我可以创建一个具有所需 Python 版本的新环境。但是我怎么知道我应该在那个新环境中安装哪些软件包呢?在“旧”版本中,我有:

  1. 我自己安装的包,
  2. 发现必要的 conda 包,
  3. 我通过 pip 安装的包

那么,当我创建一个新环境时,我应该如何记住我在旧环境中安装了哪些软件包,因此我应该在新环境中也安装它们? conda env exportconda list 不是很有帮助,因为它们显示所有包(包括它们的当前版本,也许还有对新 Python 版本不再有效的包),我只想过滤掉我自己的包已经安装,所以我知道它们也应该存在于新环境中(并且依赖项将自动安装)。同样的问题也适用于 pip。

【问题讨论】:

    标签: python pip conda


    【解决方案1】:

    Conda 对用户提供的环境约束有一个特定的术语:explicit specification。这将对应于您的第一组软件包(由用户请求安装)。可以使用--from-history 标志来指定导出的环境应该只包含明确的规范:

    conda env export --from-history
    

    在这一切之下,它处理$CONDA_PREFIX/conda-meta/history 文件(该文件具有所有环境变异 Conda 命令的历史记录)以提炼出明确请求的约束。还应该注意的是,某些操作,例如使用 --update-deps 标志,可以触发 Conda 将 env 中的每个包添加到显式规范中。不确定摆脱这种情况的干净方法;可能必须自己处理history 文件以检查conda install 命令。

    然而,这些都不会捕获使用pip 安装的东西。

    【讨论】:

    • 谢谢,这很有帮助,虽然它不能解决问题。例如。您提到的 history 文件在我的情况下不包含单个 installcreate 命令。根据我的环境名称搜索它也没有找到任何命中,因此我怀疑这个历史文件不完整。我只知道这里所说的内容更少:docs.conda.io/projects/conda/en/latest/user-guide/tasks/…您是否推荐任何更详尽的文档?
    • @Maciek 每个环境都有自己的history 文件。您是否正在查看感兴趣的环境中的那个?或者您是否使用conda env create -f env.yaml 创建了环境?您是否尝试过从历史命令导出?历史文件更像是最后的手段,即查看内部结构。
    • 大声笑,好点,不,我直接(并且完全)去了$CONDA_PREFIX/conda-meta/history,而不是去envs目录中的特定环境。确实,那里似乎有一段有效的历史。谢谢!
    【解决方案2】:

    +++ 详细的pip show 命令应显示带有Installer 的行。例如:

    $ python -m pip show --verbose setuptools
    Name: setuptools
    Version: 49.6.0
    [...]
    Installer: pip
    [...]
    

    +++ 详细的pip list 命令应该列出当前环境中所有活动的发行版及其安装程序。例如:

    $ python -m pip list --verbose
    $ .venv/bin/python -m pip list --verbose
    Package       Version Location                                  Installer
    ------------- ------- ----------------------------------------- ---------
    pip           20.2.3  /path/to/venv/lib/python3.8/site-packages pip
    setuptools    49.6.0  /path/to/venv/lib/python3.8/site-packages pip
    

    +++ 每个安装的发行版都应该有一个INSTALLER 文件。例如:

    $ cat /path/to/venv/lib/python3.8/site-packages/setuptools-49.6.0.dist-info/INSTALLER
    pip
    

    +++ 一个简短的示例代码,展示了如何列出当前环境中的所有发行版及其安装程序:

    #!/usr/bin/env python3
    
    import importlib.metadata
    
    def main():
        for distribution in importlib.metadata.distributions():
            installer = None
            for file_path in distribution.files:
                if file_path.name == 'INSTALLER':
                    installer = file_path.read_text().strip()
                    break
            print(f"{distribution.metadata['Name']} -- {installer}")
    
    if __name__ == '__main__':
        main()
    

    【讨论】:

    • 但这会显示有关 setuptools 的信息,列出所有内容怎么样?在我看来pip list --user 会做。 conda中对应的命令怎么样?
    猜你喜欢
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 2018-03-14
    • 2014-02-20
    • 2022-01-08
    • 2019-07-09
    相关资源
    最近更新 更多