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.txt2. pip install -r requirements.txt |
1. conda env export > environment.yml2. conda env create -f environment.yml |
1. conda pack -n myenv2. mkdir -p ~/myenv && tar -xzf myenv.tar.gz -C ~/myenv3. 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:适用于 Linux 的 Windows 子系统
1.启用Windows功能
控制面板 -> 程序 -> 启用或关闭Windows功能,如下图所示:

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
Micromamba 是 Mamba 生态下的轻量、高性能包 / 环境管理器,以静态链接的单一二进制分发,无预装 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执行
前置条件:
- 安装
uv,并配置清华源;
export UV_DEFAULT_INDEX="https://pypi.tuna.tsinghua.edu.cn/simple"
- 安装
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执行
前置条件:
- 安装
docker; - 下载
uv相关平台的release包; - 设置挂载路径。例如:
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镜像,也可选用miniconda或miniforge镜像,命令略有不同。选用micromamba是为了极致轻量化; -
包名支持指定具体版本,例如
conda_packages="numpy=1.26.4"或pip_packages="numpy=1.26.4"。也可提前将环境依赖信息整理至requirements.txt或environment.yml,根据文件进行安装; -
混合
pip和conda安装是为了精简环境包体积。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可通过WSL和Docker Desktop两种方式。
安装依赖时,优先使用uv pip install,保证环境的精简性;当出现兼容性问题时,换用conda源进行安装,保证包的一致性和可用性。

浙公网安备 33010602011771号