86 votes

Comment partager des environnements conda entre différentes plates-formes

La documentation de conda sur http://conda.pydata.org/docs/using/envs.html explique comment partager des environnements avec d'autres personnes.

Cependant, la documentation nous indique que cela n'est pas multiplateforme :

NOTE: Ces fichiers de spécification explicites ne sont généralement pas multiplateformes, et comportent donc un commentaire en haut, tel que # platform: osx-64 montrant la plateforme sur laquelle ils ont été créés. Cette plateforme est celle sur laquelle ce fichier de spécification est connu pour fonctionner. Sur d'autres plateformes, les paquets spécifiés pourraient ne pas être disponibles ou des dépendances pourraient manquer pour certains des paquets clés déjà dans la spécification.

NOTE: Conda ne vérifie pas l'architecture ou les dépendances lors de l'installation à partir d'un fichier de spécification explicite. Pour vous assurer que les paquets fonctionnent correctement, assurez-vous que le fichier a été créé à partir d'un environnement de travail et qu'il est utilisé sur la même architecture, système d'exploitation et plateforme, tels que linux-64 ou osx-64.

Existe-t-il une méthode efficace pour partager et recréer un environnement conda dans une plateforme (par exemple, CentOS) dans une autre plateforme (par exemple, Windows) ?

111voto

Eric Dill Points 946

Cette réponse est donnée en supposant que vous souhaitez vous assurer que les mêmes versions des packages qui vous importent généralement se trouvent sur différentes plates-formes et que vous ne vous souciez pas des versions exactes de tous les packages de l'arborescence de dépendance entière. Si vous essayez d'installer la même version exacte de tous les packages dans votre arborescence de dépendance entière, cela a de fortes chances d'échouer car certains packages conda ont des dépendances différentes pour osx/win/linux. Par exemple, la recette pour otrobopt installera des packages différents sur Win vs. osx/linux, donc la liste de l'environnement serait différente.

Recommandation : créez manuellement un fichier environment.yaml et spécifiez ou épinglez uniquement les dépendances qui vous importent. Laissez le solveur conda faire le reste. Il est probablement utile de noter que conda-env (l'outil que vous utilisez pour gérer les environnements conda) recommande explicitement que vous "Créez toujours votre fichier environment.yml manuellement."

Ensuite, il vous suffit de faire conda env create --file environment.yml

Jetez un œil au readme de conda-env.

Ils peuvent être assez simples :

name: basic_analysis
dependencies:
  - numpy
  - pandas

Ou plus complexes où vous épinglez les dépendances et spécifiez les canaux anaconda.org à installer :

name: stats-web
channels:
  - javascript
dependencies:
  - python=3.4   # ou 2.7 si vous vous sentez nostalgique
  - bokeh=0.9.2
  - numpy=1.9
  - nodejs=0.10
  - flask
  - pip:
    - Flask-Testing

Dans les deux cas, vous pouvez créer un environnement avec conda env create --file environment.yaml.

NOTE : Vous pourriez avoir besoin d'utiliser .* comme suffixe de version si vous utilisez une version plus ancienne de conda.

0 votes

Voici une explication vraiment utile. Merci!

3 votes

Il serait bon que Conda envisage l'approche JavaScript, d'un package.json avec des dépendances "de premier ordre" et un package-lock.json/yarn.lock pour toutes les sous-dépendances.

0 votes

Veuillez consulter la réponse de @Adam Murphy pour une option moins manuelle qui n'essaie pas de reproduire tout l'environnement : conda env export --from-history.

27voto

Adam Murphy Points 195

Alors qu'il est possible de créer votre fichier environment.yml manuellement, vous pouvez vous assurer que votre environnement fonctionne sur toutes les plateformes en utilisant le drapeau conda env export --from-history.

Cela inclura uniquement les packages que vous avez demandés explicitement, plutôt que d'inclure tous les packages de votre environnement.

Par exemple, si vous créez un environnement et installez un package conda install python=3.8 numpy, il installera de nombreuses autres dépendances ainsi que python et numpy.

Si vous exécutez ensuite conda env export > environment.yml, votre fichier environment.yml inclura toutes les dépendances supplémentaires installées automatiquement par conda pour vous.

En revanche, l'exécution de conda env export --from-history créera simplement un environment.yml avec python=3.8 et numpy et fonctionnera donc sur toutes les plateformes.

Réponse adaptée de la documentation.

1 votes

Cela ne fonctionne généralement pas sur différentes plateformes d'après mon expérience.

0 votes

Cela ne fonctionne que si aucune bibliothèque n'a été installée via pip. conda env export vous permet d'obtenir à la fois les bibliothèques installées via conda et pip.

4voto

Conda-env export doit être utilisé pour exporter votre environnement complet dans un fichier nommé my_env.yml.

Vérifiez la solution de travail pour obtenir uniquement le préfixe sur OS X au lieu de la dépendance complète incluant pip.

Étape 1 : désactivez l'environnement s'il est activé. sinon cela créera un fichier yml avec seulement le préfixe.

Étape 2 : exécutez la commande ci-dessous pour exporter

conda-env export -n my_env > my_env.yml

cela exportera toutes les dépendances requises, les canaux et les installations pip dans un fichier yml qui peut être importé pour le partager avec d'autres.

Étape 3 : exécutez la commande ci-dessous pour importer

conda-env create -n my_env -f= my_env.yml

cela créera l'environnement exact tel quel sur la machine partagée.

3voto

Allan Points 407

Pour ceux qui sont intéressés par une solution pour maintenir un seul fichier d'environnement qui peut être utilisé dans Linux, macOS et Windows, veuillez consulter l'outil conda-devenv sur https://github.com/ESSS/conda-devenv.

0voto

Un aspect manquant des autres réponses est que le demandeur mentionne des "fichiers de spécification" et non pas un fichier "environment.yml". Ces éléments sont différents.

Fichier de spécification

Un fichier de spécification spécifie les URL exactes des packages et est utilisé pour recréer des environnements identiques (sur la même plateforme).

Il ressemble à ceci:

# Ce fichier peut être utilisé pour créer un environnement en utilisant :
# $ conda create --name  --file 
# plateforme : osx-64
@EXPLICIT
https://repo.anaconda.com/pkgs/free/osx-64/mkl-11.3.3-0.tar.bz2
https://repo.anaconda.com/pkgs/free/osx-64/numpy-1.11.1-py35_0.tar.bz2
https://repo.anaconda.com/pkgs/free/osx-64/openssl-1.0.2h-1.tar.bz2
https://repo.anaconda.com/pkgs/free/osx-64/pip-8.1.2-py35_0.tar.bz2
https://repo.anaconda.com/pkgs/free/osx-64/python-3.5.2-0.tar.bz2
https://repo.anaconda.com/pkgs/free/osx-64/readline-6.2-2.tar.bz2
https://repo.anaconda.com/pkgs/free/osx-64/setuptools-25.1.6-py35_0.tar.bz2

Il peut être obtenu avec conda list --explicit à partir de l'environnement conda d'intérêt.
Pour créer un nouvel environnement avec, on utiliserait la commande conda create:

conda create --name  --file 

environment.yml

Le fichier environment.yml est bien décrit dans cette réponse.

Il peut être obtenu avec les commandes suivantes à partir de l'environnement conda d'intérêt:

  • conda env export pour obtenir tous les packages dans l'environnement actuel
  • conda env export --from-history pour n'obtenir que les packages installés explicitement (c'est-à-dire sans dépendances ajoutées automatiquement)

Cette question est assez ancienne et conda a évolué entre-temps. Peut-être que le sens original du fichier de spécification était équivalent aux fichiers environment.yml, mais pour plus de clarté, j'ajoute cette réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X