ChatGPT解决这个技术问题 Extra ChatGPT

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

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

conda install --yes --file requirements.txt

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

使用 Anaconda Cloud api 站点 https://api.anaconda.org 获取包元数据:.... org with 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 尝试从它可用的任何地方安装它。


T
Till Hoffmann

我最终只是迭代了文件的行

$ 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 以换行符结尾,以便读取最终包
有没有办法在迭代时自动pip install使用 conda install 不可用的包?
@delusionX,我已经扩展了答案。
@TillHoffmann 在 Windows 机器上的解决方案:FOR /F "delims=~" %f in (requirements.txt) DO conda install --yes "%f" || pip install "%f" 效果很好。谢谢!
如果您在需求文件中有评论,pip 会详细地抱怨(如果无害的话会很烦人)。忽略注释的 bash 单行代码的一种变体:while read req; do if [[ $req != "#"* ]]; then conda install --yes $requirement || pip install $requirement; fi; done < requirements.txt
j
jopasserat

您可以按照 this 中所述执行此操作

导出到 .yml 文件

conda env export > freeze.yml

重现:

conda env create -f freeze.yml

M
MarredCheese

假设您有一个现有的环境可以复制,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/


Y
Yuri-M-Dias

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