以最小化要求导出 Conda 环境

phy*_*bus 4 python environment anaconda

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

conda env export --name my_env > myenv.yml

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

name: my_env
channels:
  - defaults
dependencies:
  - scipy=1.3.1
  - pip=19.2.3
Run Code Online (Sandbox Code Playgroud)

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

mer*_*erv 8

Conda CLI 中的选项

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

conda env export --from-history --name my_env > myenv.yml
Run Code Online (Sandbox Code Playgroud)

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

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


污染

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


Pet*_*ter 7

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

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

  • 这是很好的建议,所以我放弃了,但并不是我真正想要的。conda 环境比 pip 要求有优势的原因是环境解决更完整。因此,当指定每个包时,它们都是相同的,但就像我在描述中提到的那样,如果上游存储库中有错误修复,conda 会捕获它,但 pip 不一定会捕获它 (2认同)