使用 "conda install --yes --file requirements.txt" 仅安装可用的包而不会出错
Install only available packages using "conda install --yes --file requirements.txt" without error
通过以下命令使用 Conda 在 requirements.txt 中安装软件包时
conda install --yes --file requirements.txt
如果 requirements.txt 中的包不可用,则会抛出“无包错误”,如下所示:
Using Anaconda Cloud api site https://api.anaconda.org
Fetching package metadata: ....
Error: No packages found in current linux-64 channels matching: nimfa ==1.2.3
You can search for this package on anaconda.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 会尝试从任一位置安装它可用的地方。
我最终只是遍历了文件的行
$ 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"
您可以按照 this
中的说明进行操作
导出到 .yml 文件
conda env export > freeze.yml
重现:
conda env create -f freeze.yml
对于那些寻找的人,我将其用作@TillHoffmann 的鱼解决方案 shell:
$ while read requirement; conda install --yes $requirement; end < requirements.txt
和
$ while read requirement; conda install --yes $requirement;or pip install $requirement; end < requirements.txt
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
文件)。有关详细信息,请参阅本指南:
通过以下命令使用 Conda 在 requirements.txt 中安装软件包时
conda install --yes --file requirements.txt
如果 requirements.txt 中的包不可用,则会抛出“无包错误”,如下所示:
Using Anaconda Cloud api site https://api.anaconda.org
Fetching package metadata: ....
Error: No packages found in current linux-64 channels matching: nimfa ==1.2.3
You can search for this package on anaconda.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 会尝试从任一位置安装它可用的地方。
我最终只是遍历了文件的行
$ 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"
您可以按照 this
中的说明进行操作导出到 .yml 文件
conda env export > freeze.yml
重现:
conda env create -f freeze.yml
对于那些寻找的人,我将其用作@TillHoffmann 的鱼解决方案 shell:
$ while read requirement; conda install --yes $requirement; end < requirements.txt
和
$ while read requirement; conda install --yes $requirement;or pip install $requirement; end < requirements.txt
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
文件)。有关详细信息,请参阅本指南: