【问题标题】:Bash Script to Conda Install requirements.txt with PIP follow-up带有 PIP 跟进的 Conda 安装 requirements.txt 的 Bash 脚本
【发布时间】:2018-06-08 12:42:21
【问题描述】:

在 linux 服务器上为 Django 应用程序安装 requirements.txt 文件时,我可以运行:

conda install --yes --file requirements.txt

如果任何包都不能通过 Conda (PackageNotFoundError) 使用,这将崩溃。这个 bash one liner 是一种很酷的方式,可以一次一行地浏览 requirements.txt 文件 source

while read requirement; do conda install --yes $requirement; done < requirements.txt

这会安装所有通过 Conda 可用的包,而不会在第一个丢失的包上崩溃。但是,我想通过捕获 Conda 的输出来跟踪失败的包,如果有 PackageNotFoundError,然后在包上运行 pip install。

我不擅长 bash,所以希望有人可以建议一个 hack。另一种解决方案可能是只写出一个名为pip-requirements.txt 的新文本文件,其中包含失败的要求。

【问题讨论】:

    标签: python bash pip anaconda


    【解决方案1】:

    我个人认为 Anaconda 环境和包管理非常出色。因此,如果您使用conda 命令在您的python 环境中更新您的包,那么我建议使用environment.yml 文件而不是requirements.txt

    environment.yml 应如下所示:

    name: root            # default is root
    channels:
    - defaults
    dependencies:         # everything under this, installed by conda
    - numpy==1.13.3
    - scipy==1.0.0
    - pip:                # everything under this, installed by pip
      - Flask==0.12.2
      - gunicorn==19.7.1
    

    要安装的命令:

    conda env update --file environment.yml
    

    注意:

    这里我们设置name: root,这是默认的anaconda环境名称。这不是如何使用condaenvironment.yml 文件的标准做法。理想情况下,每个 python 项目都应该有自己的 environment.yml 文件,并带有项目特定的环境名称,即 name: project-name。请通过https://conda.io/docs/user-guide/tasks/manage-environments.html 了解如何使用 Anaconda 进行包管理。

    【讨论】:

    • 这很酷,谢谢,这意味着我必须查看很长的依赖项列表并将它们解析出来。此外,我团队的其他成员正在处理同一个 repo 并且没有使用 Anaconda,因此我必须针对他们添加到 requirements.txt 的每个新依赖项进行测试和更新。现在你让我觉得如果有一个脚本来读取 requirements.txt 并生成 environment.yml 文件会更酷。
    • 不客气!另外我不知道你在做什么,所以我可能在你的情况下错了,但我很早就发现任何项目的依赖项列表通常都很小,大约 20 个。但是在你的环境中安装的包的数量可能很大,主要是因为您的依赖项最终会安装许多自己的依赖项。例如,安装Flask 也会同时安装WerkzeugclickJinja2 等。但您只需要在requirements.txtenvironment.yml 中包含Flask
    • 是的,我正在开发一个非常成熟的 Django 项目,所以requirements.txt 文件中有 50 个奇怪的包,我敢打赌其中一些是多余的。我发现您可以使用conda env export &gt; environment.yml 导出environment.yml,这非常巧妙。请参阅下面的答案。
    • 我个人认为使用conda env export 并不是一个好主意,正是由于我上面提到的原因。如果您正在开发一个不打算维护的一次性应用程序,它可能非常有用。但是如果你有一个项目需要长期维护,将环境完全转储到environment.yml文件中会在不久的将来导致很多版本冲突,因为environment.yml文件使​​用精确的@ 987654346@ 版本控制,其中包子依赖项通常使用更开放的&gt;= 版本控制。
    • 非常感谢!这是我见过的最好的部门管理答案。为了澄清其他人的担忧,应该注意 yml 文件可以省略或定义范围的版本号,也可以省略传递依赖项。所以写 yml 文件而不是生成它可能是有意义的
    【解决方案2】:

    找到解决办法:

    如果包对 conda 不可用,请运行此命令以使用 conda 或 pip 进行安装:

    while read requirement; do conda install --yes $requirement || pip install $requirement; done < requirements.txt 
    

    完成后,您可以使用 conda 导出环境 yaml:

    conda env export > environment.yml
    

    【讨论】:

    • 需要注意的是,像这样混合 conda 和 pip 会导致依赖安装两次。 (因为我认为 pip 看不到 conda 依赖项?)
    【解决方案3】:

    将标准错误重定向到一个文件:

    while read requirement; do conda install --yes $requirement; done < requirements.txt 2>error.log
    

    【讨论】:

    • 这行得通,谢谢。错误消息非常冗长,所以我将不得不按照@Nitred 的建议手动制作pip-requirements.txtenvironment.yml
    猜你喜欢
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 2018-06-19
    • 2018-12-05
    • 2021-12-27
    • 2019-08-27
    • 1970-01-01
    • 2020-12-02
    相关资源
    最近更新 更多