python一键式迁移conda环境的方法(解决Solving environment: failed)

        最近需要将个人电脑上配置的conda环境迁移到linux系统的服务器上。

        由于安装的库太多,不想一个个手动重新进行安装,于是上网找了很多迁移conda环境的方法。

        但会遇到下面的问题:

python一键式迁移conda环境的方法(解决Solving environment: failed)_第1张图片

        解决办法应该是删除库后面等号后面对应的内容。但在库数目很多时,手动删除等号后的字符串实在是繁琐,所以写了一段代码解决上述问题。

        方法主要就是删除库后面的版本号,并且将pip安装的库单独分割出来,用pip命令单独安装。

# 本代码用于移植conda环境
# 首先在需要移植的环境下输入 conda env export > old_env.yml 保存环境参数
# 然后剔除掉无法识别的库,并分立conda和pip 分别用两者进行安装
# 需要手动修改yml首尾的环境名和环境保存路径
# conda env create -f old_env.yml
# pip install -r requirement.text

def file_to_list(file_path):
    read_file_ = ""
    text_list_ = []
    num_ = 0
    with open(file_path, "r", encoding="utf-8") as f:
        for line in f:
            text_list_.append(line)
            read_file_ += '%d | ' % num_ + line
            num_ += 1
    return text_list_, read_file_


odd_yml_path = '/home/user/old_env.yml'    # linux下yml文件的绝对路径
new_yml_path = '/home/user/new_env.yml'    # 修改后的yml保存路径
requirement_path = '/home/user/requirement.text'    # 
new_env_name = 'new_env'    # linux下新安装的环境名称
new_env_path = '/home/user/anaconda3/envs/new_env'    # 环境路径 可以用conda info --env查看现有环境的路径

text_list, read_file = file_to_list(odd_yml_path)

# 无法导入的库 需要先用conda试一遍 conda会提示哪些识别不了
# 把提示的库复制在下方
ignore_f = '  - pywin32-ctypes\
  - m2w64-gcc-libgfortran\
  - m2w64-gcc-libs-core\
  - win_inet_pton\
  - vs2015_runtime\
  - pywinpty\
  - icc_rt\
  - m2w64-libwinpthread-git\
  - vc\
  - m2w64-gmp\
  - wincertstore\
  - winpty\
  - m2w64-gcc-libs\
  - msys2-conda-epoch'
f2 = ''
for i in range(len(text_list)):
    if '-' in text_list[i]:
        out = ''
        num = 0
        for j in text_list[i]:
            if j == '=':
                num += 1
            if num < 1:
                out += j
        if '  - pip:\n' == text_list[i]:
            break
        text_list[i] = out
        text_list[i] += '\n'

for i in range(len(text_list)):
    if 'name:' in text_list[i]:
        text_list[i] = 'name: ' + new_env_name + '\n'
    if 'prefix:' in text_list[i]:
        print('123123')
        text_list[i] = 'prefix: ' + new_env_path + '\n'
            
start_flag = False
requirement_text = ''
for i in range(len(text_list)):
    if '  - pip:\n' == text_list[i]:
        start_flag = True
        requirement_text += '  - pip\n'

    if start_flag:
        if 'prefix' not in text_list[i]:
            requirement_text += text_list[i]

text_list_new = []
for i in range(len(text_list)):
    if text_list[i][:-2] not in ignore_f:
        text_list_new.append(text_list[i])

for i in range(len(text_list_new)):
    f2 += text_list_new[i]

with open(requirement_path, "w", encoding="utf-8") as f:
    f.write(requirement_text)

with open(new_yml_path, "w", encoding="utf-8") as f:
    f.write(f2)

接着到linux系统下进入yml保存的路径,分别运行下面两行代码即迁移成功。

conda env create -f new_env.yml
pip install -r requirement.text

你可能感兴趣的:(python,conda,linux)