将 Anaconda 移动到新的文件夹
目录
最近需要将 CMA-PI 上的个人目录从 /g3 迁移到 /g11。 我已在 /g3 的个人目录中安装 Anaconda3,并已在实时运行的测试系统中应用。
虽然大部分软件都可以通过修改 PATH 环境变量或者修改 Modules 配置文件的方式支持目录迁移,但 Anaconda 环境却无法直接移动目录。
原因
conda 命令是一个 Python 脚本,从下面的源码中可以看到第一行指定了 Python 可执行程序的绝对路径。
#!/g3/wangdp/lang/python/anaconda3/bin/python
# -*- coding: utf-8 -*-
import sys
# Before any more imports, leave cwd out of sys.path for internal 'conda shell.*' commands.
# see https://github.com/conda/conda/issues/6549
if len(sys.argv) > 1 and sys.argv[1].startswith('shell.') and sys.path and sys.path[0] == '':
# The standard first entry in sys.path is an empty string,
# and os.path.abspath('') expands to os.getcwd().
del sys.path[0]
if __name__ == '__main__':
from conda.cli import main
sys.exit(main())
虽然直接修改第一行的路径可以让 conda 命令重新生效,但当运行 juypter 命令时依然会出错。
jupyter 命令也是一个 Python 脚本,源码中第一行同样指定了 Python 可执行程序的绝对路径。
#!/g3/wangdp/lang/python/anaconda3/envs/nwpc-data/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from jupyter_core.command import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())
其他 Python 脚本形式的可执行程序也可能遇到同样的问题。
尽管可以通过 sed 等命令批量替换目录,但编写 sed
命令不太容易,也无法确定是否会遇到其他类型的问题。
方案
Anaconda 有官方的推荐迁移目录方法:重新安装!
如果想要保留原有的环境,可以先将环境导出到一个 YAML 文件中。
conda env export > environment.yml
在新安装的 Anaconda 中使用该文件创建环境
conda env create -f environment.yml
生成的 environment.yml
文件如下所示:
name: nwpc-data
channels:
- pytorch
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
- conda-forge
- defaults
dependencies:
- _libgcc_mutex=0.1=conda_forge
- _openmp_mutex=4.5=1_llvm
- altgraph=0.16.1=py_0
- appdirs=1.4.3=py_1
# ...
- zlib=1.2.11=h516909a_1006
- zstd=1.4.4=h6597ccf_3
- pip:
- eccodes-python==0.9.7
- nwpc-workflow-model==0.5.0
# ..
- tqdm==4.46.0
prefix: /g3/wangdp/lang/python/anaconda3/envs/nwpc-data
其中包含使用 pip 安装的软件。 如果 pip 安装的软件无法在线安装,例如上面的 nwpc-workflow-model 包,最好将其删掉,在环境创建完成后,再手动使用 pip 安装。
注:笔者执行命令时没有删除,也可以创建环境。