为了在我的团队中可重复地进行改进,我在一个新创建的运行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环境文件?
答案 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
的事实让人感到欣慰的是,这条线路毫无用处......