将 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 安装。

注:笔者执行命令时没有删除,也可以创建环境。

参考

Moving Anaconda from one directory to another