来自 .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 建议的解决方案。
我想在离线机器(即无法访问互联网)上从 .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 建议的解决方案。