J'ai un environnement Conda nommé old_name
comment puis-je changer son nom en new_name
sans briser les références ?
Booooo pourquoi on ne peut pas renommer un conda env ?
J'ai un environnement Conda nommé old_name
comment puis-je changer son nom en new_name
sans briser les références ?
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 ousource 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 :
--offline
pour le désactiver)Il y a une ouverture numéro demandant cette fonction.
Afin de laisser du travail à ceux qui utilisent conda et ainsi leur faire comprendre beaucoup plus en route :P :D
@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.
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é
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".
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 ?
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/*
Si c'est trivial, ce serait formidable que vous contribuiez à la base de code ! Beaucoup l'apprécieraient (moi y compris)
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.
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 :
conda env export > environment.yml
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)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".
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é... ?
** 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
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 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.
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