【问题标题】:Export Conda Environment with minimized requirements以最低要求导出 Conda 环境
【发布时间】:2020-10-09 17:28:31
【问题描述】:

将 Anaconda 环境导出到 YAML 文件的典型命令是:

conda env export --name my_env > myenv.yml

但是,一个大问题是该文件的可读性,因为它包含所有库及其所有依赖项的硬规范。 Anaconda 有没有办法导出一个包含这些依赖项以使 YAML 更具可读性的最佳最小命令子集的列表?例如,如果您在 conda 环境中安装的所有内容都是 pipscipy,那么 Anaconda 有没有办法意识到文件应该只是读取:

name: my_env
channels:
  - defaults
dependencies:
  - scipy=1.3.1
  - pip=19.2.3

这样,anaconda 环境仍将具有完全相同的规范,即使没有改进(如果上游错误已修复),任何查看 yml 文件的人都会理解运行代码的“必需”条件,从某种意义上说,如果他们确实想要/不能使用 conda 环境,他们就会知道需要安装哪些软件包?

【问题讨论】:

  • 有时声称兼容的软件包的新版本不兼容,或者引入错误,或者不保持精确的可重复性(如果你关心的话)等等 - 这就是人们经常想要的原因他们的传递依赖被固定。大多数包管理器都有一个依赖文件和一个“锁定文件”——前者更容易阅读和更新,后者更准确。不幸的是,Conda 还没有内置这个功能。您可能想看看这里描述的 conda-lock:pythonspeed.com/articles/conda-dependency-management

标签: python anaconda environment


【解决方案1】:

来自 Conda CLI 的选项

这有点像 --from-history 标志的用途,但不完全是。它不会包含每个包的确切构建信息,而是仅包含所谓的显式规范,即用户通过 CLI 明确请求的规范(例如,conda install scipy=1.3.1)。试一试:

conda env export --from-history --name my_env > myenv.yml

如果用户在安装过程中最初包含了版本,这将只包含 versions。因此,创建新环境很可能不会使用完全相同的版本和构建。另一方面,如果用户最初包含超出版本和构建的其他约束,它们也会被包含(例如,通道规范 conda install conda-forge::numpy 将导致 conda-forge::numpy)。

另一个值得注意的选项是 --no-builds 标志,它将导出 YAML 中的每个包,但忽略构建说明符。这些标志以相互排斥的方式工作。


conda 缩小

如果这还不够,还有一个名为 conda-minify 的外部实用程序,它提供了一些功能来导出基于依赖关系树而不是通过用户的显式规范最小化的环境。

【讨论】:

  • 不错!这与我所说的很接近,并且可能适用于我的任务。我正在寻找的是可以考虑完整安装集并创建一个 minimal conda env 文件的东西,无论我如何到达那里,它只显示最小必要的库安装以重现环境。例如。如果在我的历史记录中我安装了scikit-learn,然后安装了scipy,我希望它忽略scipy,因为它是由sci-kit-learn 作为依赖项安装的。
  • @physincubus 是有道理的。您需要编写脚本 - 从当前的 CLI 中是不可能的。也许有一种方法可以使用 Conda 的内部方法仅获取依赖图的叶子。此外,不确定您希望这样的最小环境应该在多长时间内有效,但一个问题是依赖关系会随着时间的推移而演变。我认为如果你想确保给定的包会引入你排除的依赖项,你需要包含版本。不幸的是,大多数用户安装时没有版本,—from-history 只会包含确切的用户规格。
  • @physincubus 刚刚遇到了这个问题:github.com/jamespreed/conda-minify 听起来像你要找的东西。
  • 哦,这太完美了!
【解决方案2】:

看看pipreqs。它仅根据您在项目中明确执行的导入创建一个 requirements.txt 文件(您甚至可以使用--no-pin 选项来忽略版本号)。您可以稍后使用此文件通过conda install --file requirements.txt 创建一个 conda 环境。

但是,如果您的目标是 evironments.yml 文件,则必须手动创建它。但这只是从干净的requirements.txt 复制和粘贴。您只需要将 conda 与“pip-only”安装分开。

【讨论】:

  • 这是一个很好的建议,所以我提出了建议,但并不是我真正想要的。 conda 环境比 pip 要求具有优势的原因是环境求解更完整。因此,当指定每个包时,它们都是相同的,但就像我在描述中提到的那样,如果上游存储库中有错误修复,conda 会捕获它,但 pip 不一定
猜你喜欢
  • 2022-11-07
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 2016-11-02
相关资源
最近更新 更多