在无网络的内网环境或安全要求严格的生产服务器上,安装Python环境和第三方依赖常常令人头疼。项目依赖出现缺失、版本不兼容导致环境报错、Miniconda版本与Python版本无法匹配,这些问题在离线场景下会被无限放大。本文将系统介绍两种业界通用的离线部署方法,并给出版本兼容性选择的完整指南。

一、pip download + 离线安装:Python依赖的全量备份方案

1.1 核心思想

离线安装Python库最折磨人的地方在于依赖的链条太长。当你信心满满传进去一个.whl文件,它会告诉你缺一个依赖;你把这个依赖传进去,它又会告诉你那个依赖还缺另一个依赖……这个过程就像俄罗斯套娃。

解决这个问题的核心方法很简单:在外网环境,一次性把目标库及其所有依赖全部完整下载下来,然后把整个依赖包文件夹打包传输到内网进行安装。

1.2 在有网环境下载包及其依赖

使用pip download命令,将目标包及其所有依赖项下载到本地指定的目录:

pip download requests -d ./packages

这条命令会完成三件事:解析requests的所有依赖项(如urllib3、certifi、charset-normalizer、idna等),下载requests自身的wheel文件,并自动下载所有依赖项的wheel文件。

如果项目依赖较多,更推荐使用requirements.txt批量下载:

pip download -r requirements.txt -d ./packages
1.3 跨平台与跨版本精确下载(重点)

当目标机器的操作系统、系统架构或Python版本与下载机器不同时,必须通过指定平台参数来确保下载的wheel文件兼容:

pip download requests --only-binary=:all: --platform=manylinux2014_x86_64 --python-version=3.11 -d ./x86_packages

常用平台标识符包括:许多Linux系统使用manylinux2014_x86_64(兼容CentOS 7+);Windows x86_64使用win_amd64;macOS(Intel)使用macosx_10_15_x86_64;macOS(Apple Silicon)使用macosx_11_0_arm64

⚠️ 注意:使用--platform--python-version参数时,必须配合--only-binary=:all:,因为源码包(.tar.gz)无法针对特定平台进行预编译。

1.4 将文件拷贝到目标机器

./packages整个文件夹复制到目标机器的任意目录(可通过U盘、内部共享存储、或手动输入URL下载等方式传输)。

1.5 离线环境安装

在目标机器上执行:

pip install requests --no-index --find-links=./packages

这条命令的核心构件是--no-index参数,它强制pip不去访问官方PyPI索引,使其变成纯粹的离线安装工具;而--find-links=./packages则告诉pip在本地的文件夹中查找所有需要的安装包。

使用requirements.txt批量安装时,命令如下:

pip install --no-index --find-links=./packages -r requirements.txt

💡 最佳实践:建议将下载目录按Python版本和平台分类组织,例如packages/cp38/packages/cp39/,并定期同步更新以保持包版本的一致性。

二、Miniconda历史版本下载指南

2.1 Miniconda是什么

Miniconda是一个免费的轻量化Python环境管理工具,仅包含conda包管理器、Python核心以及少数必要包,安装包仅几十MB。它最强大的特性是支持在同一系统中创建多个隔离的Python环境,实现多版本Python共存。

2.2 历史版本存档仓库

Anaconda官方将所有Miniconda历史版本存放在归档服务器上,地址为:

https://repo.anaconda.com/miniconda/

在这个页面中可以找到所有平台的历史版本安装文件,包括Windows的.exe、macOS的.sh和Linux的.sh文件。

2.3 Python 3.6兼容版本示例

以Miniconda3-4.5.4为例,这是最后一个官方发布的Python 3.6兼容版本,适用于运行基于Python 3.6老项目的开发场景:

  • Linux x86_64版本下载wget https://repo.anaconda.com/miniconda/Miniconda3-4.5.4-Linux-x86_64.sh
  • Windows x86_64版本下载wget https://repo.anaconda.com/miniconda/Miniconda3-4.5.4-Windows-x86_64.exe

下载完成后,建议验证文件哈希(SHA256:a036d1e1550fe483a86e227c1aadf0d12d3a6a6514e5c4f0c0a89f1f3cd3d6c),确保文件完整性。

2.4 Miniconda版本与Python版本的对应关系

Miniconda分为两个变体:Miniconda基于Python 2(根环境默认安装Python 2.7),Miniconda3基于Python 3(根环境默认安装Python 3.11)。

但是,无论你安装哪个版本的Miniconda,都可以在创建新环境时覆盖默认的Python版本,灵活切换到任意Python版本(如Python 3.7到Python 3.12):

conda create -n py38_env python=3.8
conda create -n py310_env python=3.10

关键提醒:Miniconda版本本身不完全等于其自带的Python版本。很多时候我们并不依赖Miniconda根环境自带的Python,而是随手创建新环境并指定所需的Python版本。

以下为官方支持的Python版本参考表:

Python版本 支持状态 常见用途
Python 3.7 ✅ 稳定支持 老项目、旧版TensorFlow
Python 3.8 ✅ 最广泛使用 PyTorch 1.x~2.0、TensorFlow 2.10+
Python 3.9 ✅ 推荐选择 多数AI框架最佳搭档
Python 3.10 ✅ 完全支持 新项目首选
Python 3.11 ✅ 支持良好 性能提升明显
Python 3.12 ⚠️ 实验性支持 部分框架尚未完全兼容

三、Miniconda离线环境搭建(conda-pack高级方案)

当需要在离线机器上部署一个包含复杂依赖的conda环境时,逐个下载.conda文件往往因传递性依赖缺失而失败。解决方案是使用conda pack工具,在有网络的环境中将整个conda环境及其所有依赖打包成一个可移植的tarball,然后在离线机器上直接解压部署。

步骤一:在有网机器上创建environment.yml文件,列出所有需要的包:

name: my_env
channels:
  - conda-forge
  - defaults
dependencies:
  - python=3.9
  - numpy=1.23.5
  - pandas=1.5.3
  - pip:
    - requests==2.28.1
    - attrs==23.1.0

步骤二:根据YAML文件创建环境并安装conda-pack:

conda env create -f environment.yml
conda install -c conda-forge conda-pack

步骤三:将环境打包成tarball并传输到内网解压部署:

conda pack -n my_env -o my_env.tar.gz

在离线机器上解压并激活环境即可使用。

另一种简单方法:如果只是想安装单独的conda包,也可以直接使用本地包文件安装:

conda install /path-to-package/package-filename.tar.bz2

四、Python版本与系统架构兼容性选择指南

4.1 Python版本选择原则
  • 生产环境谨慎选择最新版本:新特性发布初期可能尚未经过充分验证,建议选择经过一定市场检验的稳定版本。
  • 项目锁定版本:强烈建议为每个项目使用独立的虚拟环境,并通过requirements.txtenvironment.yml锁定依赖版本。
  • 框架兼容性先行:不同的框架对Python版本有明确要求。例如,PyTorch 2.0官方文档明确建议不要使用Python 3.10以上版本;开源项目在运行前务必检查其environment.ymlREADME.md中指定的Python版本。
4.2 系统架构匹配要点
  • 操作系统:Windows使用.exe.whl,macOS和Linux使用.sh或特定架构的包。
  • 处理器架构:x86_64是最通用的服务器/桌面架构,aarch64为ARM架构(如树莓派、部分云服务器),需下载对应版本。
  • GLIBC版本:使用manylinux标签可以确保在较老的Linux系统(如CentOS 7)上也能正常工作。
  • Python ABI兼容性:包文件名中的cp39-cp39-manylinux标识了该包适用于CPython 3.9版本,使用--python-version参数可确保下载与目标机匹配的包。
4.3 如何检查python wheel包的平台兼容性标签

打开wheel包的文件名查看即可。例如requests-2.31.0-py3-none-any.whl中的py3表示适用于任何Python 3实现,none表示无ABI要求,any表示适用于任何平台——这种包最万能,纯Python实现,所有平台都可以用。

如果需要锁定某一个特定平台,文件名会包含具体标识,比如pandas-2.0.3-cp39-cp39-manylinux_2_24_x86_64.whl,其中的cp39要求Python 3.9,manylinux_2_24_x86_64要求使用基于Debian 9的manylinux标准运行在x86_64架构上。

总结:两种离线方案的结合使用

在实际离线部署场景中,pip download更适用于轻量级的Python虚拟环境,灵活性高,适合项目依赖较为简单的小规模部署;Miniconda历史版本配合conda pack更适用于复杂的AI/Conda生态,能够处理非Python依赖(如CUDA驱动、C++库等)。

最常用的工作流程是:在外网机器上先安装Miniconda历史版本,用conda create创建项目所需的Python版本环境,然后用pip download将所需包及其依赖全部下载下来,最后将Miniconda安装包和packages文件夹一同传输到内网,先安装Miniconda,激活环境后再用pip install --no-index --find-links完成所有包的离线安装。

通过本文介绍的方法,即便在最严苛的内网环境中,也能从容应对Python环境的离线部署挑战。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐