为了在整个团队中实现可重复性改进,我在运行
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 安装的唯一路径。
当我的同事尝试加载环境时,脚本实际上对他们来说运行良好,这意味着
prefix
变量基本上被 conda 忽略。
我曾经使用 virtualenvs,我的绝对路径进入一个应该共享的文件以使事情可以在不同的机器上重现的想法真的让我感到困惑。
所以我的问题是:前缀变量的用途是什么?有没有办法在没有它的情况下导出 conda 环境文件?
这个问题已经在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 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 文档的“
手动创建环境文件”部分中甚至没有提到
prefix
,这一事实令人欣慰的是,这一行毫无用处......
我认为这个问题是为什么 conda 在用于与其他人共享的文件中包含用户本地路径。 当我获得足够的声誉时,我会将其转换为评论。