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

时间:2018-03-08 13:24:47

标签: python anaconda virtualenv conda miniconda

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

我的同事想下载回购并运行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安装的唯一路径。

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

我曾经和virtualenvs一起工作,并且我的绝对路径进入一个文件,这个文件应该被共享,以便在不同的机器上重现,这真的让我很困惑。

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

1 个答案:

答案 0 :(得分:6)

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

conda doc中未提及,但conda env export --prefix PATH允许指定前缀的事实除外。 但请注意,此处--name--prefix选项是独占的。

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

  来自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)

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

  来自conda.base.context.py的

上下文()

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

修改

在conda doc的“creating an environment file manually”部分中甚至没有提及prefix的事实让人感到欣慰的是,这条线路毫无用处......