conda 应该给我们一个像cond env rename <old> <new> 这样的简单工具,但它没有。简单地重命名目录,如this previous answer,当然会破坏硬编码的 hashbangs(#!)。
因此,我们需要更深入地实现我们想要的。
conda env list
# conda environments:
#
base * /home/tgowda/miniconda3
junkdetect /home/tgowda/miniconda3/envs/junkdetect
rtg /home/tgowda/miniconda3/envs/rtg
这里我想重命名rtg --> unsup(请忍耐这些名字,这是我真正的用例)
$ 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
the previous answer 报告了这一点,但是等等,我们还没有完成!
待处理的任务是,$NEW/bin dir 有一堆可执行脚本,其中包含指向 $OLD env 路径的 hashbangs (#!)。
见jupyter,例如:
$ 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
所以,我们可以用 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
现在我们完成了?
我认为编写一个可移植的脚本来完成所有这些并将其绑定到conda env rename old new 应该是微不足道的。
我在 ubuntu 上对此进行了测试。无论出于何种不可预见的原因,如果出现问题并且您希望恢复上述更改:
$ mv $NEW $OLD
$ sed -i.bak "s:envs/$NEW/bin:envs/$OLD/bin:" $OLD/bin/*