来自 .yaml 离线的 Conda 环境

Conda environment from .yaml offline

我想在离线机器(即无法访问互联网)上从 .yaml 文件创建一个 Conda 环境。在在线机器上,这工作得很好:

conda env create -f environment.yaml

但是,它在离线机器上不起作用,因为找不到包。我该怎么做?

如果这不可能,是否有另一种简单的方法可以将我的完整 Conda 环境转移到离线机器(包括 Conda 和 pip 安装包)?

从 .tar.bz2 文件中一个一个地检查软件包以安装它们是可行的,但它非常麻烦,所以我想避免这种情况。

如果你可以使用 pip 安装包,你应该看看 devpi,尤其是它的服务器。 devpi 可以缓存通常从 PyPI 安装的包,因此只有在第一次安装时它才会真正检索它们。您必须配置 pip 以从 devpi 服务器检索包。

因为您不想手动列出所有包及其依赖项,所以您应该在连接到 Internet 的机器上:

  • 安装 devpi 服务器(我在 Docker 容器中安装了 运行ning)
  • 运行 你的安装
  • 检查 devpi 存储库并从那里收集所有 .tar.bz2.whl 文件(您可以 tar 全部)

在未连接的机器上:

  • 安装devpi服务器和客户端
  • 使用 devpi 客户端将您收集的所有包(使用 devpi upload)上传到 devpi 服务器
  • 确保您已配置 pip 以查看 devpi 服务器
  • 运行pip,它会找到本地服务器上的所有包。

devpi 有一个小的学习曲线,它已经值得遍历,因为速度和安装私人包(即不上传到 PyPI)作为正常依赖的能力,只需生成包和将其上传到您本地的 devpi 服务器。

我猜 Anthon 上面的解决方案相当不错,但以防万一有人对适合我的简单解决方案感兴趣:

我首先使用 conda env export > file.yaml 创建了一个指定环境的 .yaml 文件。按照 http://support.esri.com/en/technical-article/000014951 上的说明,我自动下载了 conda 安装包所需的所有安装文件,并从这些文件创建了一个频道。为此,我只是调整了上面 link 中的代码以使用我的 .yaml 文件而不是他们使用的 conda 列表文件。此外,我通过遍历 .yaml 文件中的 pip 条目并使用 pip download 下载每个文件,自动下载了 pip 安装包所需的文件。此外,我从 .yaml 文件自动创建了单独的 conda 和 pip 需求列表。然后我使用带有离线标志的 conda create 创建了环境,带有 conda 要求的文件和我的自定义通道。最后,我使用 pip install 安装了 pip 要求,其中包含 pip 要求文件和包含选项 --find-links.

的 pip 安装文件的文件夹

这对我有用。唯一的问题是,如果您需要指定与您使用的操作系统不同的操作系统,则只能使用 pip 下载二进制文件 运行,并且对于某些软件包,没有可用的二进制文件。现在这对我来说没问题,因为目标机器具有一些特性,但将来可能会出现问题,所以我打算研究 Anthon 建议的解决方案。