Python环境教程(四)-Linux环境打包与离线部署

Linux环境打包与离线部署

迁移方式对比

Windows下开发,Linux部署,如何保证跨平台环境的一致性?下面是三种主流迁移方式对比。

对比维度 pip freeze conda env export conda pack
核心原理 仅导出 Python 包列表 (requirements.txt),在目标环境重新下载安装。 导出环境的完整配置(包括 Python 版本、Conda 包、pip 包)到 environment.yml 文件,在目标环境基于该文件重建。 将整个 Conda 环境目录打包成一个 .tar.gz 文件,在目标环境解压并激活。
迁移对象 纯 Python 依赖包。 Conda 环境的所有内容(Python 解释器、Conda 包、pip 包、环境变量等)。 整个 Conda 环境目录(二进制文件、库、依赖等)。
跨平台兼容性 。只要依赖包支持目标平台,即可安装。 非常好environment.yml 文件是跨平台的,Conda 会自动在目标平台寻找合适的包。 。打包的环境包含了原平台的二进制文件(如 .so.dll),直接在其他平台解压通常无法运行。
环境可复现性 一般。可能因平台、渠道或包版本下架导致无法完全复现。 。能精确复现环境的包版本和通道信息。 极高。在相同平台上,能完全复现原始环境的每一个细节。
迁移速度 中等。取决于网络速度和包的大小,需要重新下载。 中等。同样需要下载所有包。 非常快。仅需复制和解压一个文件,无需重新下载。
磁盘空间占用 。仅生成一个很小的 requirements.txt 文件。 。仅生成一个 environment.yml 文件。 。打包后的文件包含了环境的所有内容,体积较大。
操作复杂度 。命令简单,易于理解。 。需要掌握 Conda 环境导出和创建的命令。 。需要掌握 conda pack 和 conda-unpack 的使用,解压后有一个简单的修复步骤。
是否需要网络 。在目标环境安装时需要网络下载包。 。在目标环境创建时需要网络下载包。 。打包和解压过程都不需要网络。
是否包含系统依赖 。不处理 Python 包之外的系统库(如 libopenblas)。 。但 Conda 自身会处理很多科学计算库的底层依赖。 。打包的是已经编译好的二进制文件,其运行仍依赖目标系统的底层库。
适用场景 - 快速分享简单的 Python 项目。
- 项目依赖主要是纯 Python 包。
- 对环境一致性要求不高。
跨平台迁移环境。
- 与他人协作,确保大家使用一致的环境。
- 项目包含复杂的 Conda 和 pip 混合依赖。
- 作为版本控制的一部分,记录环境配置。
同平台下的快速环境克隆或备份。
- 部署到没有网络连接的服务器。
- 需要在多台相同配置的机器上快速部署完全一致的环境。
优点 - 简单直观,无学习成本。
- 生成的文件小,便于分享。
跨平台能力强,配置文件清晰。
- 能精确复现复杂环境,包括 Conda 和 pip 包。
- 符合 Conda 的最佳实践。
迁移速度极快,无需重新下载。
- 在相同平台上环境一致性极高
- 离线迁移能力。
缺点 - 无法迁移 Python 解释器版本。
- 不包含 Conda 管理的非 Python 包。
- 可复现性不如 Conda 原生方法。
- 在目标环境需要重新下载所有包,耗时较长。
- 如果包在渠道中下架,可能导致创建失败。
不支持跨平台
- 打包文件体积大。
- 解压后的环境路径被硬编码,需要 conda-unpack 修复(通常自动完成)。
典型命令 1. pip freeze > requirements.txt
2. pip install -r requirements.txt
1. conda env export > environment.yml
2. conda env create -f environment.yml
1. conda pack -n myenv
2. mkdir -p ~/myenv && tar -xzf myenv.tar.gz -C ~/myenv
3. source ~/myenv/bin/activate (Linux/macOS)
  • pip freeze:最简单直接的方式,但灵活性和可复现性较差。不推荐作为跨平台或复杂环境的主要迁移方案。
  • conda env export:跨平台环境迁移的首选和最可靠方案,前提是服务器可以联网。
  • conda env pack:同平台内快速克隆或离线迁移的最佳选择,解压即用。

跨平台离线迁移

​ 目标服务器无法联网,只能通过conda pack这一种方式。

​ 借助一台能联网的 Linux 机器作为 “中转节点”,先通过 Windows 导出的environment.yml在该节点上重建与开发环境一致的 Linux 版 Conda 环境,再利用conda pack对这个 Linux 环境进行离线打包。由于打包的是原生 Linux 环境,将压缩包传输至目标离线 Linux 服务器后,解压即可直接激活使用,从而兼顾跨平台一致性与离线部署的需求。

​ 大多数情况下,我们不用太关注包的具体版本 —— 一方面因为 python 包普遍具备向后兼容性,另一方面 Conda 会自动解析并安装与当前环境兼容的依赖版本。此时我们只需明确区分python版本、pip包和conda包即可。

​ 至于能联网的Linux主机,可以另辟蹊径。windows安装WSL或者Docker Desktop。

安装WSL

官网:安装 WSL | Microsoft Learn

WSL:适用于 Linux 的 Windows 子系统

1.启用Windows功能

控制面板 -> 程序 -> 启用或关闭Windows功能,如下图所示:

image-20251124114524807

2.一键安装

在管理员模式下打开 PowerShell,输入wsl --install命令,然后重新启动计算机。

wsl --install

若已安装出现其他错误,可尝试执行wsl --update,更新wsl版本。

wsl --update

安装Docker Desktop

官网:Docker: Accelerated Container Application Development

Windows:提前安装好WSL并重启,下载exe,一路next即可。

Linux:Linux还装什么Docker Desktop,直接安装Docker Engine。安装详情参照官网:Install | Docker Docs

1.搭建Docker apt仓库

# Add Docker's official GPG key:
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update

2.安装Docker包

sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

3.验证是否安装成功

# 查看docker版本
docker -v
# 拉取并运行hello-world镜像
sudo docker run hello-world

Micromamba

官网:Micromamba Installation — documentation

Github地址:mamba-org/micromamba-releases: Micromamba executables mirrored from conda-forge as Github releases

MicromambaMamba 生态下的轻量、高性能包 / 环境管理器,以静态链接的单一二进制分发,无预装 base 环境、不依赖系统 Python 与共享库,兼容 Conda 通道与 environment.yml,在 CI/CD、容器、无 root 与资源受限场景表现突出。

Micromamba可简单理解为大幅简化版的conda命令,且兼容 conda 的大部分语法。

安装

Linux / macOS / Windows (git bash)

"${SHELL}" <(curl -L https://micro.mamba.pm/install.sh)

Windows

Invoke-Expression ((Invoke-WebRequest -Uri https://micro.mamba.pm/install.ps1).Content)

或者通过micromamba-releases下载打包文件进行安装。

命令

micromamba --help
Version: 2.4.0

micromamba.exe [OPTIONS] [SUBCOMMAND]

OPTIONS:
  -h,     --help              Print this help message and exit
          --version

Configuration options:
          --rc-file FILE1 FILE2...
                              Paths to the configuration files to use
          --no-rc             Disable the use of configuration files
          --no-env            Disable the use of environment variables

Global options:
  -v,     --verbose           Set verbosity (higher verbosity with multiple -v, e.g. -vvv)
          --log-level ENUM:value in {critical->5,debug->1,error->4,info->2,off->6,trace->0,warning->3} OR {5,1,4,2,6,0,3}
                              Set the log level
  -q,     --quiet             Set quiet mode (print less output)
  -y,     --yes               Automatically answer yes on prompted questions
          --json              Report all output as json
          --offline           Force use cached repodata
          --dry-run           Only display what would have been done
          --download-only     Only download and extract packages, do not link them into
                              environment.
          --experimental      Enable experimental features
          --use-uv            Whether to use uv for installing pip dependencies. Defaults to
                              false.

Prefix options:
  -r,     --root-prefix PATH  Path to the root prefix
  -p,     --prefix PATH       Path to the target prefix
          --relocate-prefix PATH
                              Path to the relocation prefix
  -n,     --name NAME         Name of the target prefix

SUBCOMMANDS:
  shell                       Generate shell init scripts
  create                      Create new environment
  install                     Install packages in active environment
  update                      Update packages in active environment
  self-update                 Update micromamba
  repoquery                   Find and analyze packages in active environment or channels
  remove, uninstall           Remove packages from active environment
  list                        List packages in active environment
  package                     Extract a package or bundle files into an archive
  clean                       Clean package cache
  config                      Configuration of micromamba
  info                        Information about micromamba
  constructor                 Commands to support using micromamba in constructor
  env                         See `mamba/micromamba env --help`
  activate                    Activate an environment
  run                         Run an executable in an environment
  ps                          Show, inspect or kill running processes
  auth                        Login or logout of a given host
  search                      Find packages in active environment or channels
                              This is equivalent to `repoquery search` command

一键构建脚本

通过bash执行

前置条件:

  1. 安装uv,并配置清华源;
export UV_DEFAULT_INDEX="https://pypi.tuna.tsinghua.edu.cn/simple"
  1. 安装micromamba,并配置清华源;
micromamba config append channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
micromamba config append channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
micromamba config append channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/

执行如下脚本一键构建Python环境并打包:

#!/bin/bash

set -e  # 遇到错误时退出

# 配置变量(根据实际调整)
name="env"  # 环境名
version="3.11"  # 版本
conda_packages="paramiko numpy"  # conda源包
pip_packages="typer loguru tqdm dynaconf polars pendulum pydantic httpx more-itertools tenacity cartopy matplotlib"  # pip源包
odir="/opt/conda/env"  # 输出目录

echo "开始构建环境: $name (Python $version)"

# 创建环境
echo "创建 Python 环境..."
micromamba create -n $name python=$version -y

# 激活环境
echo "激活环境..."
eval "$(micromamba shell hook --shell bash)" && micromamba activate $name

# 安装 pip 包
echo "安装 pip 包..."
if [ -n "$pip_packages" ]; then
    uv pip install $pip_packages
fi

# 卸载 pip 包, 安装 conda 包
echo "安装 conda 包..."
if [ -n "$conda_packages" ]; then
    uv pip uninstall $conda_packages --quiet
    micromamba install -y $conda_packages
fi

# 导出环境配置
echo "导出环境配置..."
micromamba env export > $odir/environment.yml
pip list --format=freeze > $odir/requirements.txt

# 打包环境
echo "打包环境..."
micromamba activate && micromamba install conda-pack -y
rm -f $odir/$name.tar.gz
conda-pack -p /opt/conda/envs/$name -o $odir/$name.tar.gz -j 16 --ignore-missing-files

echo "环境打包完成: $odir/$name.tar.gz"

通过docker执行

前置条件:

  1. 安装docker
  2. 下载uv相关平台的release包;
  3. 设置挂载路径。例如:D:/project/env为环境包输出目录,D:/project/resources为资源目录。

执行如下脚本一键构建Python环境并打包:

docker run -it --rm --user root \
-v D:/project/env:/opt/conda/env \
-v D:/project/resources:/opt/conda/resources \
--name micromamba mambaorg/micromamba \
/bin/bash /opt/conda/env/pack.sh

pack.sh内容如下:

#!/bin/bash

set -e  # 遇到错误时退出

# 配置变量
name="env"
version="3.11"
conda_packages="paramiko numpy"
pip_packages="typer loguru tqdm dynaconf polars pendulum pydantic httpx more-itertools tenacity cartopy matplotlib"
odir="/opt/conda/env"
rdir="/opt/conda/resources"

echo "开始构建环境: $name (Python $version)"

# 解压并配置 uv
echo "配置 uv..."
tar -xzf $rdir/uv-x86_64-unknown-linux-gnu.tar.gz -C /usr/bin --strip-components=1
export UV_DEFAULT_INDEX="https://pypi.tuna.tsinghua.edu.cn/simple"

# 配置 conda 镜像源
echo "配置 conda 镜像源..."
micromamba config append channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
micromamba config append channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
micromamba config append channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/

# 创建环境
echo "创建 Python 环境..."
micromamba create -n $name python=$version -y

# 激活环境
echo "激活环境..."
eval "$(micromamba shell hook --shell bash)" && micromamba activate $name

# 安装 pip 包
echo "安装 pip 包..."
if [ -n "$pip_packages" ]; then
    uv pip install $pip_packages
fi

# 卸载 pip 包, 安装 conda 包
echo "安装 conda 包..."
if [ -n "$conda_packages" ]; then
    uv pip uninstall $conda_packages --quiet
    micromamba install -y $conda_packages
fi

# 导出环境配置
echo "导出环境配置..."
micromamba env export > $odir/environment.yml
pip list --format=freeze > $odir/requirements.txt

# 打包环境
echo "打包环境..."
micromamba activate && micromamba install conda-pack -y
rm -f $odir/$name.tar.gz
conda-pack -p /opt/conda/envs/$name -o $odir/$name.tar.gz -j 16 --ignore-missing-files

echo "环境打包完成: $odir/$name.tar.gz"
  • 若网络允许,可跳过设置清华源;

  • 选用 uv 进行安装,可解决原生 pip 安装速度过慢的问题,大幅提升依赖安装效率。

  • 环境包构建基于micromamba镜像,也可选用minicondaminiforge镜像,命令略有不同。选用micromamba是为了极致轻量化;

  • 包名支持指定具体版本,例如conda_packages="numpy=1.26.4"pip_packages="numpy=1.26.4"。也可提前将环境依赖信息整理至requirements.txtenvironment.yml,根据文件进行安装;

  • 混合pipconda安装是为了精简环境包体积。conda 会安装预编译后的二进制文件,兼容性较好但包过大;优先使用 pip 安装,pip优先分发源码包,wheel 包经过标准化精简,仅包含运行必需的文件(如剔除源码、编译中间件),当 pip 安装的包出现兼容性问题时,才推荐切换为 conda 安装方式。

解压使用

tar命令

-A                      将tar文件添加到归档文件
-c                      创建一个新归档文件
-x                      从归档文件中提取文件
-f                      指定归档文件的名称,为了便于区别文件的类型,建议以.tar结尾,若对目标归档文件或目录进行压缩,一般以tar.gz命令
                        这个选项通常是必选的。
-v                      打印tar命令处理的详细过程,没-v选项将不会打印出任何信息。
-t                      列出归档文件里的内容
-u                      更新文件,只添加比归档文件复制更新的文件。
-m                      不要解压文件的修改时间,也就是说在还原文件时,把所有文件的修改时间设定为现在。
-a, --auto-compress     使用归档后缀名来决定压缩程序
-j, --bzip2             通过 bzip2压缩或解压文件。
-J, --xz                通过 xz压缩或解压文件。
--lzip                  通过 lzip 压缩或解压文件。
--lzma                  通过 lzma 压缩或解压文件。
-r                      把要存档的文件追加到备份文件的末尾,比如用户已经完成了备份文件的工作,但是却发现还有一个目录或是一些
                        文件遗漏了备份,这时可以使用该选项,将忘记的目录或文件追加到已经的备份文件中。
-w                      每一步都要求确认。
-z                      通过 gzip 来压缩或解压文件。
-Z                      通过 compress 压缩或解压文件。

Linux平台下执行tar -xzvf xxx.tar.gz解压文件,解压后,env/bin/python即为python解释器。

执行 Python 程序时需指定该解释器全路径,命令格式为:/xxx/env/bin/python xxx.py

总结

构建离线可分发的Python环境包,核心是借助conda-pack工具在同平台上进行打包,Windows安装Linux可通过WSLDocker Desktop两种方式。

安装依赖时,优先使用uv pip install,保证环境的精简性;当出现兼容性问题时,换用conda源进行安装,保证包的一致性和可用性。

posted @ 2025-12-11 09:19  Alphapy  阅读(21)  评论(0)    收藏  举报