520 votes

Comment renommer un environnement Conda ?

J'ai un environnement Conda nommé old_name comment puis-je changer son nom en new_name sans briser les références ?

0 votes

Voir aussi ce billet sur la façon de cloner un environnement conda

12 votes

Vous ne pouvez pas renommer (frustrant !) mais vous pouvez cloner l'ancien env avec le nouveau nom et supprimer l'ancien env : conda create --name new_name --clone old_name puis supprimer l'ancien : conda remove --name old_name --all

810voto

pkowalczyk Points 3703

Tu ne peux pas.

Une solution de contournement consiste à créer cloner un nouvel environnement et ensuite supprimer l'original.

Tout d'abord, n'oubliez pas de désactiver votre environnement actuel. Vous pouvez le faire avec les commandes :

  • deactivate sur Windows ou
  • source deactivate sur macOS/Linux.

Ensuite :

conda create --name new_name --clone old_name
conda remove --name old_name --all # or its alias: `conda env remove --name old_name`

Notez que cette méthode présente plusieurs inconvénients :

  1. Il redécharge les paquets (vous pouvez utiliser --offline pour le désactiver)
  2. Temps passé à copier les fichiers de l'environnement
  3. Double utilisation temporaire du disque

Il y a une ouverture numéro demandant cette fonction.

256 votes

Booooo pourquoi on ne peut pas renommer un conda env ?

12 votes

Afin de laisser du travail à ceux qui utilisent conda et ainsi leur faire comprendre beaucoup plus en route :P :D

1 votes

@silgon Eh bien, c'est pas ma solution (mais c'est une solution relativement évidente). J'ai juste rassemblé ces informations sur SO pour une meilleure recherche - le fil de discussion de github n'est pas apparu dans les recherches google.

38voto

kkuma7 Points 161

conda create --name new_name --copy --clone old_name est meilleur

J'utilise conda create --name new_name --clone old_name qui est sans --copy mais rencontre des ruptures de pip...

l'url suivante peut vous aider L'installation de tensorflow dans un environnement conda cloné casse l'environnement conda duquel il a été cloné

1 votes

Mvenv () { conda create --name $2 --copy --clone $1 ; conda remove --name $1 --all ; }

0 votes

(Mettez cela à la fin de ~/.bashrc et vous avez apparemment la fonctionnalité demandée. N'hésitez pas à l'incorporer dans votre réponse puisque je n'aurais pas pu concevoir votre solution impliquant à la fois --clone et --copy).

16voto

bgoodr Points 653

Sur la base de dwanderson Grâce au commentaire utile de l'auteur, j'ai pu faire cela en une seule ligne de Bash :

conda create --name envpython2 --file <(conda list -n env1 -e )

Mon env mal nommé était "env1" et le nouvel env que je souhaite cloner à partir de celui-ci est "envpython2".

4 votes

J'ai rencontré une erreur disant PackagesNotFoundError: The following packages are not available from current channels avec ce script. Ce script ne fonctionne probablement que lorsque vous n'avez pas de paquets qui sont installés avec pip et qui ne sont pas disponibles dans conda dans l'environnement existant ?

15voto

Thamme Gowda Points 320

Conda aurait dû nous donner un outil simple comme cond env rename <old> <new> mais ce n'est pas le cas. Il suffit de renommer le répertoire, comme dans cette réponse précédente bien sûr, cela casse les crochets de hachage codés en dur (# !). Par conséquent, nous devons aller un niveau plus profond pour atteindre ce que nous voulons.

conda env list
# conda environments:
#
base                  *  /home/tgowda/miniconda3
junkdetect               /home/tgowda/miniconda3/envs/junkdetect
rtg                      /home/tgowda/miniconda3/envs/rtg

Ici, j'essaie de renommer rtg --> unsup (merci d'être indulgent avec ces noms, c'est mon cas réel d'utilisation)

$ cd /home/tgowda/miniconda3/envs 
$ OLD=rtg
$ NEW=unsup
$ mv $OLD $NEW   # rename dir

$ conda env list
# conda environments:
#
base                  *  /home/tgowda/miniconda3
junkdetect               /home/tgowda/miniconda3/envs/junkdetect
unsup                    /home/tgowda/miniconda3/envs/unsup

$ conda activate $NEW
$ which python
  /home/tgowda/miniconda3/envs/unsup/bin/python

la réponse précédente rapporté jusqu'ici, mais Attendez, nous n'avons pas encore fini ! la tâche en cours est, $NEW/bin Le répertoire contient un tas de scripts exécutables avec des hashbangs ( #! ) pointant vers les chemins d'accès à l'environnement $OLD.

Voir jupyter par exemple :

$ which jupyter
/home/tgowda/miniconda3/envs/unsup/bin/jupyter

$ head -1 $(which jupyter) # its hashbang is still looking at old
#!/home/tgowda/miniconda3/envs/rtg/bin/python

Donc, nous pouvons facilement le corriger avec un sed

$ sed  -i.bak "s:envs/$OLD/bin:envs/$NEW/bin:" $NEW/bin/*  
# `-i.bak` created backups, to be safe

$ head -1 $(which jupyter) # check if updated
#!/home/tgowda/miniconda3/envs/unsup/bin/python
$ jupyter --version # check if it works
jupyter core     : 4.6.3
jupyter-notebook : 6.0.3

$ rm $NEW/bin/*.bak  # remove backups

Maintenant, nous avons terminé

Je pense qu'il devrait être trivial d'écrire un script portable pour faire tout cela et le lier à conda env rename old new .


J'ai testé ceci sur ubuntu. Pour n'importe quelle raison imprévue, si les choses se cassent et que vous souhaitez revenir sur les changements ci-dessus :

$ mv $NEW  $OLD
$ sed  -i.bak "s:envs/$NEW/bin:envs/$OLD/bin:" $OLD/bin/*

9 votes

Si c'est trivial, ce serait formidable que vous contribuiez à la base de code ! Beaucoup l'apprécieraient (moi y compris)

0 votes

Le sed -i '' "s/old/new" $NEW/bin/* rencontrera l'erreur "not a regular file", pour moi. Pour remplacer toutes les lignes de bandelettes dans tous les fichiers réguliers, je dois utiliser : $ find $NEW/bin/* -maxdepth 1 -type f -exec sed -i.bak "s:envs/$OLD/bin:envs/$NEW/bin :" {} \ ; pour échapper aux fichiers non réguliers.

0 votes

Qu'en est-il des bibliothèques binaires qui sont relocalisées en utilisant rpath ? Il n'est pas simple de relocaliser les environnements Conda car il y a beaucoup de magie dans les coulisses pour le faire fonctionner comme un environnement isolé.

9voto

Long Points 54

Comme la réponse de @pkowalczyk a mentionné quelques inconvénients : A mon humble avis, le sans douleur et sans risque (solution de rechange) est de suivre ces étapes à la place :

  1. Activer et exporter votre environnement actuel conda env export > environment.yml
  2. Désactiver l'environnement conda actuel. Modifiez le environment.yml et modifiez le nom de l'environnement comme vous le souhaitez (généralement, il se trouve sur la première ligne du fichier yaml fichier)
  3. Créez un nouvel environnement conda en exécutant ceci conda env create -f environment.yml

Ce processus prend quelques minutes, et vous pouvez maintenant supprimer l'ancien environnement en toute sécurité.

P.S. Près de 5 ans et Conda n'a toujours pas sa fonctionnalité "renommer".

0 votes

J'aime cette réponse, et je suis en train de l'exécuter. Je crois cependant que le prefix: ... devrait également être changée pour le nouveau nom, afin que le dossier env ne soit pas réutilisé... ?

0 votes

** MISE À JOUR ** - la modification du préfixe dans environment.yml n'a PAS été honorée. Mais l'ajout du -p a bien fonctionné : conda env create -f environment.yml -p /path/to/env

0 votes

Vous n'avez pas à changer quoi que ce soit, au contraire, vous fournissez --name tout en créant un nouvel environnement. Notez que votre fichier d'environnement doit se terminer par .yml pas .txt .

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