如何在另一台机器上克隆 Python 工作环境?

数据挖掘 Python 蟒蛇
2021-10-07 20:07:19

我在我的工作站上使用 Python (Anaconda + Flask) 开发了一个机器学习模型,一切顺利。后来,我尝试将这个程序发送到另一台机器上,当然我尝试设置相同的环境,但程序无法运行。我将该程序复制到其他运行平稳的机器上。

我无法弄清楚失败案例中的问题是什么(程序代码和错误消息都很丰富,所以我无法在这里展示它们)但我几乎可以肯定它与依赖项的不同版本有关.

所以,我的问题是,给定某个程序运行良好的环境,我如何将它克隆到另一个它也应该运行良好的环境?当然,无需克隆整个系统;)

4个回答

首先,这是一个 Python/Anaconda 问题,可能应该在不同的堆栈交换子站点中提出。


至于问题本身 - 您可以使用以下方法导出您的 Anaconda 环境:

conda env export > environment.yml

并使用以下方法重新创建它:

conda env create -f environment.yml

请注意,正如其他人所建议的那样 - 您应该使用虚拟环境,它允许您创建与您的机器分开的特定环境并更轻松地管理它。

要在 Anaconda 中创建虚拟环境,您可以使用:

conda create -n yourenvname python=x.x anaconda

您使用以下方式激活:

source activate yourenvname

TLDR
使用 conda 包
安装使用 conda 或 pip:

康达锻造:

conda install -c conda-forge conda-pack

派皮:

pip install conda-pack

那么对于:

备份:

# Pack environment my_env into my_env.tar.gz
$ conda pack -n my_env

# Pack environment my_env into out_name.tar.gz
$ conda pack -n my_env -o out_name.tar.gz

# Pack environment located at an explicit path into my_env.tar.gz
$ conda pack -p /explicit/path/to/my_env

恢复:

并在其他机器上恢复它:

# Unpack environment into directory `my_env`
$ mkdir -p my_env
$ tar -xzf my_env.tar.gz -C my_env

# Use Python without activating or fixing the prefixes. Most Python
# libraries will work fine, but things that require prefix cleanups
# will fail.
$ ./my_env/bin/python

# Activate the environment. This adds `my_env/bin` to your path
$ source my_env/bin/activate

# Run Python from in the environment
(my_env) $ python

# Cleanup prefixes from in the active environment.
# Note that this command can also be run without activating the environment
# as long as some version of Python is already installed on the machine.
(my_env) $ conda-unpack

一点解释:

如果您计划获取当前环境的精确副本,然后将其移动到具有相同平台和操作系统的另一台机器上,而无需再次从 Internet 重新下载所有软件包(适用于离线机器/防火墙后面)。所有其他以前的方法都需要互联网连接。因此,如果您无法访问互联网,则可以使用conda pack.

康达包

conda-pack 是一个命令行工具,用于归档 conda 环境,其中包括安装在环境中的包的所有二进制文件。当您想要重现互联网访问受限或没有互联网访问的环境时,这很有用。之前的所有方法都从各自的存储库下载包以创建环境。请记住,conda-pack 是特定于平台和操作系统的,并且目标计算机必须具有与源计算机相同的平台和操作系统。

要安装 conda-pack,请确保您位于根环境或基础环境中,以便它在子环境中可用。Conda-pack 在 conda-forge 或 PyPI 上可用。

对于未来的更新检查参考

首先使用以下命令导出当前 conda 环境的环境配置:

conda-env  export -n your_env_name > your_env_name.yml

例子:

conda-env  export -n base> base.yml

运行上述命令后,它们应该是您当前目录中的 yml 配置文件,其中包含您的 conda 环境信息

要使用 yml 配置文件创建新环境,请运行:

conda-env create -n new_env -f=\path\to\base.yml 

例子:

conda-env create -n venv -f=base.yml

如果上述方法不起作用(由于 conda 本身的各种问题),总是值得尝试以下变体:

conda-env create --name new_env --file \path\to\base.yml 

如果你的程序主要是 Python,你可以完全依赖虚拟环境。

创建虚拟环境以隔离您的依赖项,而不是使用系统库。然后使用虚拟环境工具复制您的环境。

在工作的 virtualenv 中,使用每个已安装的 Python 库的版本创建一个文件:

pip freeze > requirements.txt

在新的 virtualenv 中,要求pip安装具有相同版本的那些库:

pip install -r requirements.txt

这可确保您在两台机器上获得相同的 lib 版本。由于您的 VCS 会跟踪 requirements.txt,因此您始终可以重新创建旧版本代码的环境。

当然,如果你需要一个数据库、一个生产网络服务器等,你最终会多走几步,你不能依赖 virtualenv 来确保两个环境匹配。这就是 Docker 介入的地方(参见Pieter21 的回答)。