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


94

通过以下命令使用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软件包不可用,可以点安装。因此,如果我可以更改行为conda install --yes --file requirements.txt以仅对不可用的软件包发出警告,则可以pip install -r requirments.txt在.travis.yml中使用该命令进行跟踪,以便TravisCI尝试从可用的任何位置进行安装。

Answers:


169

我最终只是遍历文件的各行

$ 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"


5
谢谢你,对于使用它的人来说,这是个小提示,请确保您的requirements.txt以换行符结尾,以便读入最终程序包
Marawan Okasha

1
有没有办法在迭代时也自动使用pip install打包不可用的软件包conda install
PeterB

2
@delusionX,我已经扩展了答案。
Till Hoffmann

11
Windows计算机上的@TillHoffmann解决方案:FOR /F "delims=~" %f in (requirements.txt) DO conda install --yes "%f" || pip install "%f" 效果很好。谢谢!
Clay

3
如果您在需求文件中有评论,则pip会抱怨(如果无害,则会烦人)。重击一线的变化,忽略了评论:while read req; do if [[ $req != "#"* ]]; then conda install --yes $requirement || pip install $requirement; fi; done < requirements.txt
drevicko


1

对于那些寻找的人,我将其用作@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

1

假设您已有复制的环境,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/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.