Instale apenas os pacotes disponíveis usando “conda install --yes --file requirements.txt” sem erros

100

Ao instalar pacotes em requirements.txt usando Conda por meio do seguinte comando

conda install --yes --file requirements.txt

Se um pacote em requirements.txt não estiver disponível, ele gerará um "Erro de nenhum pacote", como o mostrado abaixo:

Usando o site da API Anaconda Cloud https://api.anaconda.org

Buscando metadados do pacote: ....

Erro: Nenhum pacote encontrado nos canais atuais do linux-64 correspondente: nimfa == 1.2.3

Você pode procurar por este pacote em anaconda.org com

anaconda search -t conda nimfa ==1.2.3

Em vez de gerar um erro, é possível alterar esse comportamento de forma que instale todos os pacotes disponíveis em requirements.txt e gere um aviso para aqueles que não estão disponíveis?

Eu gostaria disso porque, o pacote nimfa que o erro diz não está disponível, pode ser instalado por pip. Portanto, se eu puder alterar o comportamento de conda install --yes --file requirements.txtapenas lançar um aviso para pacotes indisponíveis, posso seguir com o comando pip install -r requirments.txtem .travis.yml para que o TravisCI tente instalá-lo de qualquer lugar onde estiver disponível.

cdeepakroy
fonte

Respostas:

174

Acabei apenas repetindo as linhas do arquivo

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

Edit : se você gostaria de instalar um pacote usando pip se ele não estiver disponível através do conda, experimente:

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

Editar : Se você estiver usando Windows (o crédito vai para @Clay ):

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

Till Hoffmann
fonte
5
Obrigado por isso, uma pequena dica para quem o usa, certifique-se de que seu requirements.txt termine com uma nova linha, para que o pacote final seja lido
Marawan Okasha
1
Existe uma maneira de também automaticamente pip installpacotes que não estão disponíveis usando conda install, durante a iteração?
PeterB
2
@delusionX, estendi a resposta.
Até Hoffmann
11
Solução de @TillHoffmann em uma máquina Windows: FOR /F "delims=~" %f in (requirements.txt) DO conda install --yes "%f" || pip install "%f" Funciona muito bem. Obrigado!
Clay
3
Se você tiver comentários no arquivo de requisitos, pip reclama detalhadamente (irritante, embora inofensivo). Uma variação do bash one-liner que ignora comentários:while read req; do if [[ $req != "#"* ]]; then conda install --yes $requirement || pip install $requirement; fi; done < requirements.txt
drevicko
1

Para quem procura, usei isso como a solução de @TillHoffmann para a concha de peixe:

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

E

$ while read requirement; conda install --yes $requirement;or pip install $requirement; end < requirements.txt
Yuri-M-Dias
fonte
1

A resposta do Pbms aqui é a maneira certa de fazer isso, supondo que você tenha um ambiente existente para copiar. Conda é totalmente capaz de instalar pacotes Conda e pacotes pip, conforme listado em environment.yml. Eu queria documentar todo o processo com mais detalhes. Observe que estou usando ambientes baseados em pastas, e é por isso que adicionei--prefix [path to environment folder] à maioria dos comandos.

Digamos que você instalou um ambiente para um projeto existente em uma pasta chamada envna pasta atual, assim:

conda create --prefix ./env

Você geraria environment.ymlpara o ambiente desse projeto assim:

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

Você criaria um novo ambiente dentro de alguma outra pasta, copiando environment.ymlpara lá e executando a partir daí:

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

Você obteria um ambiente já existente para corresponder environment.yml, copiando novamente environment.ymlpara lá e executando isto a partir daí:

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

Com o ambiente em questão ativo, você verificaria o estado de seus pacotes assim:

conda list

Esta é uma versão resumida do que esse comando pode imprimir (observe que os pacotes pip estão marcados 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

Finalmente, esta é uma versão resumida do que environment.ymlpode ser (observe que os pacotes pip estão listados em sua própria categoria):

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

Esteja ciente de que usar Conda e pip juntos pode causar alguma azia porque eles podem, sem saber, explodir as dependências um do outro. Você deve instalar todos os seus pacotes Conda primeiro e, em seguida, todos os pacotes pip, em vez de alternar entre os dois. Se o seu ambiente quebrar, a recomendação oficial é excluí-lo e recriá-lo (de seu environment.ymlarquivo). Para obter mais detalhes, consulte este guia:

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

MarredCheese
fonte