以最低要求导出 Conda 环境

Export Conda Environment with minimized requirements

将 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 文件的人都会理解 运行 代码,从某种意义上说,如果他们确实想要 to/couldn 不使用 conda 环境,他们会知道他们需要安装哪些包?

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

创建一个 conda 环境

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

来自 Conda CLI 的选项

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

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

如果用户最初在安装期间包含版本,这将仅包含 版本。因此,创建新环境很可能不会使用完全相同的版本和构建。另一方面,如果用户最初包含版本和构建之外的其他约束,它们也将包含在内(例如,频道规范 conda install conda-forge::numpy 将导致 conda-forge::numpy)。

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


conda-minify

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