使用“conda install --yes --file requirements.txt”仅安装可用的软件包而不会出错

Posted

技术标签:

【中文标题】使用“conda install --yes --file requirements.txt”仅安装可用的软件包而不会出错【英文标题】:Install only available packages using "conda install --yes --file requirements.txt" without error 【发布时间】:2016-06-18 14:16:37 【问题描述】:

通过以下命令使用 Conda 在 requirements.txt 中安装包时

conda install --yes --file requirements.txt

如果 requirements.txt 中的包不可用,则会引发“无包错误”,如下所示:

使用Anaconda Cloud api网站https://api.anaconda.org

获取包元数据:....

错误:在当前 linux-64 通道中找不到匹配的包:nimfa ==1.2.3

你可以在 anaconda.org 上搜索这个包

anaconda search -t conda nimfa ==1.2.3

除了抛出错误之外,是否可以更改此行为,使其在 requirements.txt 中安装所有可用的包,并对不可用的包发出警告?

我想要这个,因为错误说的包 nimfa 不可用,可以 pip 安装。因此,如果我可以将conda install --yes --file requirements.txt 的行为更改为只对不可用的包发出警告,我可以在 .travis.yml 中使用命令pip install -r requirments.txt 跟进它,以便 TravisCI 尝试从它可用的任何地方安装它。

【问题讨论】:

【参考方案1】:

我最终只是遍历文件的行

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

编辑:如果你想使用 pip 安装一个包,但它不能通过 conda 获得,试试这个:

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

编辑:如果您使用的是 Windows(感谢 @Clay):

$ FOR /F "delims=~" %f in (requirements.txt) DO conda install --yes "%f" || pip install "%f"

【讨论】:

感谢您,给任何使用它的人的小提示,确保您的 requirements.txt 以换行符结尾,以便读取最终包 有没有办法在迭代时自动使用conda install 不可用的pip install 包? @delusionX,我已经扩展了答案。 @TillHoffmann 在 Windows 机器上的解决方案:FOR /F "delims=~" %f in (requirements.txt) DO conda install --yes "%f" || pip install "%f" 效果很好。谢谢! 如果您在需求文件中有 cmets,pip 会冗长地抱怨(如果无害的话会很烦人)。忽略 cmets 的 bash 单线变体:while read req; do if [[ $req != "#"* ]]; then conda install --yes $requirement || pip install $requirement; fi; done < requirements.txt【参考方案2】:

您可以按照this 中的说明进行操作

导出为 .yml 文件

conda env export > freeze.yml

复制:

conda env create -f freeze.yml

【讨论】:

这里是archive.org链接web.archive.org/web/20170704223211/https://www.continuum.io/…【参考方案3】:

对于那些寻找的人,我将其用作@TillHoffmann 的鱼壳解决方案:

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

还有

$ while read requirement; conda install --yes $requirement;or pip install $requirement; end < requirements.txt

【讨论】:

【参考方案4】:

Pbms 的答案是正确的方法,假设您有一个现有的环境可以复制。 Conda 完全能够安装 Conda 包和 pip 包,如environment.yml 中所列。我想更详细地记录整个过程。请注意,我使用的是基于文件夹的环境,这就是我在大多数命令中添加--prefix [path to environment folder] 的原因。

假设您将现有项目的环境安装到当前文件夹中名为 env 的文件夹中,如下所示:

conda create --prefix ./env

您将为该项目的环境生成environment.yml,如下所示:

conda env export --prefix ./env > environment.yml

您可以通过将environment.yml 复制到那里然后从那里运行它来在某个其他文件夹中创建一个新环境:

conda env create --prefix ./env --file environment.yml

通过再次将environment.yml 复制到那里然后从那里运行它,您将获得一个已经存在的环境来匹配environment.yml

conda env update --prefix ./env --file environment.yml --prune

在有问题的环境处于活动状态时,您可以像这样验证其包的状态:

conda list

这是该命令可能打印的内容的精简版本(请注意,pip 包标记为pypi):

# Name                    Version                   Build  Channel
pip                       19.2.2                   py37_0
python                    3.7.4                h5263a28_0
numpy                     1.16.4           py37h19fb1c0_0
pandas                    0.25.1           py37ha925a31_0
pyodbc                    4.0.27           py37ha925a31_0
ibm-db                    3.0.1                    pypi_0    pypi
ibm-db-sa                 0.3.5                    pypi_0    pypi

最后,这是environment.yml 的简化版本(请注意,pip 包列在它们自己的类别中):

dependencies:
  - pip=19.2.2=py37_0
  - python=3.7.4=h5263a28_0
  - numpy=1.16.4=py37h19fb1c0_0
  - pandas=0.25.1=py37ha925a31_0
  - pyodbc=4.0.27=py37ha925a31_0
  - pip:
    - ibm-db==3.0.1
    - ibm-db-sa==0.3.5

请注意,同时使用 Conda 和 pip 可能会导致一些胃灼热,因为它们会在不知不觉中消除彼此的依赖关系。您应该先安装所有 Conda 包,然后再安装所有 pip 包,而不是在两者之间交替。如果您的环境中断,官方建议是删除并重新创建它(从您的environment.yml 文件中)。有关详细信息,请参阅本指南:

https://www.anaconda.com/using-pip-in-a-conda-environment/

【讨论】:

以上是关于使用“conda install --yes --file requirements.txt”仅安装可用的软件包而不会出错的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)