Installez uniquement les packages disponibles en utilisant "conda install --yes --file requirements.txt" sans erreur

96

Lors de l'installation de packages dans requirements.txt à l'aide de Conda via la commande suivante

conda install --yes --file requirements.txt

Si un package dans requirements.txt n'est pas disponible, il renvoie une "Erreur de package" telle que celle illustrée ci-dessous:

Utilisation du site Api Anaconda Cloud https://api.anaconda.org

Récupération des métadonnées du package: ....

Erreur: Aucun paquet trouvé dans les canaux Linux-64 actuels correspondant: nimfa == 1.2.3

Vous pouvez rechercher ce package sur anaconda.org avec

anaconda search -t conda nimfa ==1.2.3

Au lieu de lancer une erreur, est-il possible de modifier ce comportement de sorte qu'il installe tous les packages disponibles dans requirements.txt et lève un avertissement pour ceux qui ne sont pas disponibles?

Je voudrais cela parce que, le package nimfa qui, selon l'erreur, n'est pas disponible, peut être installé par pip. Donc, si je peux changer le comportement de conda install --yes --file requirements.txtpour simplement lancer un avertissement pour les paquets indisponibles, je peux le suivre avec la commande pip install -r requirments.txtdans .travis.yml afin que TravisCI tente de l'installer à partir de n'importe quel endroit où il est disponible.

cdeepakroy
la source

Réponses:

170

J'ai fini par parcourir les lignes du fichier

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

Edit : Si vous souhaitez installer un package à l'aide de pip s'il n'est pas disponible via conda, essayez ceci:

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

Edit : Si vous utilisez Windows (le crédit revient à @Clay ):

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

Till Hoffmann
la source
5
Merci pour cela, petit indice pour tous ceux qui l'utilisent, assurez-vous que votre requirements.txt se termine par une nouvelle ligne, afin que le package final soit lu
Marawan Okasha
1
Existe-t-il un moyen également d'automatiser les pip installpackages qui ne sont pas disponibles en utilisant conda install, pendant l'itération?
PeterB
2
@delusionX, j'ai étendu la réponse.
Till Hoffmann le
11
La solution de @TillHoffmann sur une machine Windows: FOR /F "delims=~" %f in (requirements.txt) DO conda install --yes "%f" || pip install "%f" fonctionne très bien. Merci!
Clay
3
Si vous avez des commentaires dans le fichier des exigences, pip se plaint verbalement (ennuyeux si inoffensif). Une variante du bash one-liner qui ignore les commentaires:while read req; do if [[ $req != "#"* ]]; then conda install --yes $requirement || pip install $requirement; fi; done < requirements.txt
drevicko
1

Pour ceux qui cherchent, j'ai utilisé ceci comme solution de @TillHoffmann pour la coquille de poisson:

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

Et

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

La réponse de Pbms ici est la bonne façon de le faire, en supposant que vous ayez un environnement existant à copier. Conda est entièrement capable d'installer à la fois les packages Conda et les packages pip, comme indiqué dans environment.yml. Je voulais documenter l'ensemble du processus plus en détail. Notez que j'utilise des environnements basés sur des dossiers, c'est pourquoi j'ai ajouté --prefix [path to environment folder]à la plupart des commandes.

Supposons que vous ayez installé un environnement pour un projet existant dans un dossier appelé envdans le dossier actuel, comme ceci:

conda create --prefix ./env

Vous généreriez environment.ymlpour l'environnement de ce projet comme ceci:

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

Vous créeriez un nouvel environnement dans un autre dossier en copiant environment.ymllà-bas, puis en l'exécutant à partir de là:

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

Vous obtiendrez un environnement déjà existant pour correspondre environment.ymlen copiant environment.ymlà nouveau là-bas, puis en l'exécutant à partir de là:

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

Avec l'environnement en question actif, vous vérifieriez l'état de ses packages comme ceci:

conda list

Ceci est une version abrégée de ce que cette commande peut imprimer (notez que les packages pip sont marqués 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

Enfin, il s'agit d'une version abrégée de ce à quoi environment.ymlpourrait ressembler (notez que les packages pip sont répertoriés dans leur propre catégorie):

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

Sachez que l'utilisation simultanée de Conda et de pip peut provoquer des brûlures d'estomac, car elles peuvent sans le savoir souffler les dépendances mutuelles. Vous êtes censé installer tous vos packages Conda en premier, puis tous vos packages pip par la suite, plutôt que d'alterner entre les deux. Si votre environnement se brise, la recommandation officielle est de le supprimer et de le recréer (à partir de votre environment.ymlfichier). Pour plus de détails, consultez ce guide:

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

MarredFromage
la source