跨平台环境下如何管理 conda 环境

7
我的项目需要在跨平台环境下运行(Mac、Win、Linux)。我创建了一个 conda 环境来管理我们的依赖项以进行简单设置。我希望确保每个想要更新环境的人都可以这样做,但是当我尝试从 Linux 导出 env 到 yml 文件时,在 Win 或 Mac 上无法正确安装,反之亦然。
我已经尝试过常规操作:
1. conda env export > env.yml conda env create --name -f env.yml
2. conda env export --no-builds > env.yml

3. https://medium.com/@Amet13/building-a-cross-platform-python-installer-using-conda-constructor-f91b70d393

4. https://tech.zegami.com/conda-constructor-tutorial-make-your-python-code-easy-to-install-cross-platform-f0c1f3096ae4

5. https://github.com/ESSS/conda-devenv/blob/master/README.rst

以上都没有给出正确答案... 我附上的一些教程可能有所帮助,但我没有成功地正确实现它们,并且它们没有包含完成教程所需的一些重要信息。

例如: 关于3/4 - 它没有解释如何创建应构建环境的yml文件。

我理解conda应该在跨平台环境中工作... 如果有人能帮忙就太好了。


“它在Win或Mac上无法正确安装”是什么意思?是因为某些依赖项在Windows上不可用吗? - FlyingTeller
这些库可能没有Win或Mac的安装包… 但我不在意这个... 我希望当我生成yml文件时,它会自动放置可以安装在win或mac上的软件包... 现在我正在手动操作,我认为应该有更好的方法。 此外,一些软件包确实在win或mac上有安装版本,但conda无法正确管理它。 - rambo
我认为将环境变量导出到yml文件并不应该以那种方式工作,它的目的是导出并重新创建一个完全相同的环境。此外,在三个平台上拥有“相同”的环境,但实际上它们并不相同,这会变得非常混乱。 - FlyingTeller
我也尝试使用conda-devenv为每个平台生成不同的yml文件,但它也没有起作用。 Anaconda的原则之一是易于在跨平台环境中安装,但我并没有看到它实现。 - rambo
1
这个回答解决了你的问题吗?如何在不同平台间共享conda环境 - neves
1个回答

10

Conda环境并非跨平台的

抱歉,您所要求的内容是不可能实现的。Conda可以将环境的软件包信息序列化为YAML格式(有助于可重复性),但不能保证它在跨平台时能够正常工作。事实上,许多软件包,尤其是含有非Python代码的软件包,需要不同的底层构建工具作为依赖项,因此您所要求的功能是无法满足的。

只使用显式规范

目前,您可以通过使用--from-history标志,将environment.yaml限制为仅包括已经用于创建环境的显式规范。该功能需要Conda v4.7.12或更高版本。

conda env export --from-history > environment.yaml

这将生成一个YAML文件,仅包括在环境历史记录中明确请求的软件包,例如,如果您的历史记录中只安装了numpy和pandas,那么生成的YAML文件将仅包括这些软件包。
conda create -n foo python=3.7 numpy
conda install -n foo pandas scikit-learn

运行 conda env export -n foo --from-history 命令的结果大概如下:

name: foo
channels:
  - defaults
dependencies:
  - python=3.7
  - numpy
  - pandas
  - scikit-learn
prefix: /your/conda/dir/envs/foo

这样,您就可以省略所有可能与平台相关的其他依赖项。


我仍然看到了很多软件包?!

我注意到,如果在环境中使用 --update-deps 标志,则会将每个依赖项添加为显式规范。这是相当不幸的。如果是这种情况,建议使用合法的规范重新创建环境,并避免在未来使用该标志。可以通过搜索您的命令历史记录来编译合法的规范列表。


1
“--from-history” 似乎已经被弃用,不再起作用。 - rjurney
@rjurney你在哪里看到的?我在代码库或问题中没有看到任何证据。 - merv
1
@merv 是的,它确实包含了信息,但它不包括软件包版本,这就是我在寻找的。希望有--from-history功能与软件包版本。 - moth
1
使用 ad hoc --channel,-c 标志安装 @SumNeuron 将不会被 conda env export 捕获(无论是否使用 --from-history 标志)。不幸的是,它只捕获 conda config --show channels 的当前状态,这实在是糟糕透了。更可重复的工作流程是采用 先写 YAML 的方法:手动编写一个包含您规格说明(和通道)的 YAML,并始终使用该文件来创建和更新您的环境(即不使用 conda {install,update,remove} 命令)。 - merv
1
@SumNeuron 听起来像是一个 channel_priority 问题。你的通道顺序不正确和/或你需要使用 flexible 而不是 strict - merv
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接