有什么方法可以从 conda 环境创建子集(或部分克隆)?

问题描述 投票:0回答:1

例如我有一个有300个包的工作环境。有没有一种干净的方法可以从只有 100 个包的环境中复制或克隆,而不需要解析/下载依赖项?

我可以手动复制文件夹并删除一堆不需要的东西,但“子克隆”方法是理想的。

python anaconda conda
1个回答
1
投票

您有一个巨大的环境,您想要使用较少数量的包创建克隆。 您安装的每个软件包还附带一系列依赖项,因此如果您想要较小的环境,则需要从您手动添加的环境规范中删除那些顶级软件包。

第一步是获取您专门添加的所有软件包及其当前规格的列表。 该脚本获取手动添加和删除的包的列表,然后提取 conda 环境中当前安装的特定版本。 它打印一个可以与

conda create
命令一起使用的规范文件:

import json
import os
import platform
import subprocess
from pathlib import Path

history_file = Path(os.environ['CONDA_PREFIX']) / 'conda-meta' / 'history'
manual_specs = {}
for line in history_file.read_text().splitlines():
    if line.startswith('# update specs'):
        specs = eval(line.split(':', 1)[-1])
        manual_specs .update(dict((spec.split('=')+[None])[:2] for spec in specs))
    if line.startswith('# remove specs'):
        specs = eval(line.split(':', 1)[-1])
        for spec in specs:
            pkg = spec.split('=', 1)[0]
            if pkg in manual_specs :
                manual_specs .pop(pkg)

shell = platform.system()=='Windows'
res = subprocess.run(['conda', 'list', '-e', '--json'], capture_output=True, shell=shell)
env_specs = json.loads(res.stdout)
required_specs = [s for s in env_specs if s['name'] in manual_specs]

# print a shortened env file:
print('# This file may be used to create an environment using:')
print('# conda create --name <env> --file <this file>')
for s in required_specs:
    print(f"{s['name']}={s['version']}={s['build_string']}")

对于我的环境,它打印:

# This file may be used to create an environment using:
# conda create --name <env> --file <this file>
datasets=2.19.0=pyhd8ed1ab_0
dill=0.3.8=pyhd8ed1ab_0
geos=3.12.2=h5a68840_0
h5py=3.11.0=nompi_py310hde4a0ea_100
ipython=8.22.2=pyh7428d3b_0
jedi=0.18.2=pyhd8ed1ab_0
lxml=5.2.1=py310hdccf185_0
matplotlib=3.5.3=py310haa95532_0
more-itertools=10.2.0=pyhd8ed1ab_0
multidict=6.0.5=py310h8d17308_0
opencv=4.8.1=py310h2d39e71_5
pandas=2.2.2=py310hecd3228_0
polars=0.20.23=pypi_0
protobuf=4.24.4=py310h19be30a_0
psutil=5.9.8=py310h8d17308_0
pyarrow=15.0.0=py310hd0bb7c2_0_cpu
pyasn1=0.4.8=pyhd3eb1b0_0
pycurl=7.45.3=py310h3f729d1_0
pyopenssl=24.0.0=py310haa95532_0
python=3.10.14=h4de0772_0_cpython
pythonnet=3.0.1=py310haa95532_0
pytorch=2.2.0=cpu_py310hb0bdfb8_0
requests=2.31.0=pyhd8ed1ab_0
ruamel.yaml=0.17.21=py310h2bbff1b_0
scikit-image=0.22.0=py310hecd3228_2
scikit-learn=1.4.2=py310hfd2573f_0
shapely=2.0.5=py310ha804f92_0
stanza=1.9.2=pyhd8ed1ab_0
tqdm=4.66.2=pyhd8ed1ab_0
transformers=4.29.2=pyhd8ed1ab_0
wincertstore=0.2=py310haa95532_2

此时,您可以将其复制/粘贴到文件中或修改脚本以写入文件(这里我称之为

env.spec
)并删除您的环境中不需要的任何软件包。

然后您可以使用以下文件创建软件包子集的克隆:

conda create -n myenv -c conda-forge --file path/to/env.spec --use-index-cache --offline

这将为您正在安装的包运行一次求解器,但只会使用您当前的缓存索引。 注意:包含您在原始环境中使用的所有通道非常重要,即

-c conda-forge -c intel -c pytorch

为了更快地求解,如果您的默认求解器不是 mamba,则可以添加

--solver libmamba
标志。

© www.soinside.com 2019 - 2024. All rights reserved.