导出不带前缀变量的 conda 环境,它显示可执行文件的本地路径

export conda environment without prefix variable which shows local path to executable

为了在我的团队中进行可重复的改进,我在新创建的存储库中导出了一个 conda 环境文件 运行ning conda env export > environment.yml.

我的想法是让我的同事下载 repo 和 运行 conda env create -f environment.yml 并准备好使用代码。

然而,我的一些同事向我指出,在 yaml 文件的底部有:

  - readline=7.0=hc1231fa_4
  - requests=2.18.4=py35h0d65e6b_1
  - setuptools=38.5.1=py35_0
  - six=1.11.0=py35h39a4c60_1
  - sqlite=3.22.0=h3efe00b_0
  - tk=8.6.7=h35a86e2_3
  - urllib3=1.22=py35he002d57_0
  - wheel=0.30.0=py35h5c0b906_1
  - xz=5.2.3=h0278029_2
  - zlib=1.2.11=hf3cbc9b_2
prefix: </path/to/your/anaconda/distribution>/envs/<env-name>/bin

带有 prefix 变量的最后一行实际上显示了我的机器名称和 miniconda 安装的唯一路径。

当我的同事尝试加载环境时,脚本实际上对他们来说工作正常,这意味着 prefix 变量基本上被 conda 忽略了。

我曾经使用 virtualenvs 工作,我的绝对路径进入一个应该共享的文件以在不同机器上重现的想法真的让我感到困惑。

所以我的问题是:前缀变量的用途是什么?有没有办法在没有它的情况下导出 conda 环境文件?

这个问题已经解决 ,但没有真正解释 prefix 的作用。 至少有一个以编程方式排除前缀行的解决方案。

conda doc中没有提到,除了conda env export --prefix PATH允许指定前缀。 但请注意,--name--prefix 选项在这里是唯一的。

如果您查看 conda 的代码,您会发现 conda create 指的是 cli_install.check_prefix()install.py 似乎表明对环境名称(从 prefix 中提取)和完整的 prefix 路径进行了安全检查,以确保不存在与相同的名称或路径。

from conda/cli/install.py

def check_prefix(prefix, json=False):
    name = basename(prefix)
    error = None
    if name == ROOT_ENV_NAME:
        error = "'%s' is a reserved environment name" % name
    if exists(prefix):
        if isdir(prefix) and 'conda-meta' not in os.listdir(prefix):
            return None
        error = "prefix already exists: %s" % prefix

    if error:
        raise CondaValueError(error, json)

    if ' ' in prefix:
        stderrlog.warn("WARNING: A space was detected in your requested environment path\n"
                       "'%s'\n"
"Spaces in paths can sometimes be problematic." % prefix)

我的猜测是 environment.yaml 中的这个 prefix 是确保 conda 知道在哪里创建环境的复杂策略的一部分。但它似乎在大多数情况下是无用的,它的存在可能只是由于--name--prefix之间的机械link。

from conda.base.context.py Context()

# This block of code sets CONDA_PREFIX based on '-n' and '-p' flags, so that
# configuration can be properly loaded from those locations

编辑:

在 conda 文档的“creating an environment file manually”部分甚至没有提到 prefix 这一事实令人欣慰,因为这一行毫无用处...