没有网络时怎么离线安装 Python whl 或 tar.gz 包

键盘旁的猫
键盘旁的猫
发布时间:2026-11-12 | 3人浏览过
原创

详细讲解在没有网络连接的环境下,如何通过有网机器提前准备、下载依赖,并在离线机器上正确安装 Python .whl 与 .tar.gz 包的完整流程、常用命令与报错排查。

Python 离线部署实战
适用场景:隔离局域网 / 生产内网服务器 / 保密机房环境 支持环境:Linux / Windows / macOS

离线安装 Python 包的核心逻辑是“外网预下依赖,内网定向直装”:在另一台能够联网的计算机上,使用 pip download 预先下载目标包及其全部依赖项保存为本地文件,通过移动存储介质转运至无网络机器后,再使用 pip install --no-index --find-links=<目录> 指定本地路径完成安装。针对 .whl(二进制轮子包)可直接复制解压安装,而针对 .tar.gz(源码包)则需保证目标系统具备相应的 C 编译工具链,或在下载时强制转为预编译的二进制 Wheel。

没有网络时怎么离线安装 Python whl 或 tar.gz 包
图示:Python 离线安装两台机器双轨协同与全流程链路概览

一、认识离线安装的核心对象与格式差异

在 Python 的分发体系中,我们最常接触到的离线安装包主要有两类:后缀为 .whl 的 Wheel 包和后缀为 .tar.gz(或 .zip)的源码包(Source Distribution,简称 sdist)。在无网络环境下,选择哪种格式直接决定了安装能否一次成功。

对比维度 .whl(Wheel 二进制分发包) .tar.gz(源码分发包 / sdist)
文件本质 符合 PEP 427 规范的 ZIP 归档,包含已编译代码和元数据。 打包源码的 tar 归档压缩包,包含 setup.py 或 pyproject.toml。
安装过程 直接解压并复制到 Python 的 site-packages 目录,秒级完成。 先解压,在离线机本地执行 build 甚至编译,生成 Wheel 后再安装。
编译链依赖 零编译要求。离线机器即使没有安装 GCC/Clang 也可顺畅安装。 若包含 C/C++ 扩展(如 NumPy、cryptography),必须有 GCC 等编译链。
平台兼容性 强绑定文件名中的操作系统、CPU 架构与 Python ABI 标签。 纯 Python 模块全平台通用;含 C 扩展模块跨平台源码通用但本地需能编译。
离线推荐度 极高(第一优选项)。避免在受限内网机折腾编译依赖。 备用(中低)。仅推荐用于纯 Python 模块或目标机自带完整编译套件。
没有网络时怎么离线安装 Python whl 或 tar.gz 包
图 1:.whl(Wheel 二进制)与 .tar.gz(源码包)离线适配特性与决策模型对比

了解这个差异至关重要:许多人在内网安装诸如 numpy、pandas、cryptography 时,如果不小心下载了 .tar.gz 源码包,一执行安装就会因为离线机没有 GCC、make 或缺失 Python.h 头文件而直接中断,陷入必须先给离线机安装 C 编译器的二次困境。因此,在离线准备阶段,应尽可能强制下载目标环境的 .whl 包。

二、离线机器的前置环境摸底

在前往联网电脑下载安装包之前,必须先在离线机器上收集其基础环境指标。这是因为 .whl 文件名严格匹配特定环境标签,一旦下载错版本,离线机就会抛出 "is not a supported wheel on this platform"。

在离线机器的终端中执行以下两行基础探测命令:

环境探测命令
python -c "import platform, sys; print(f'OS: {platform.system()} | Arch: {platform.machine()} | Python: {sys.version.split()[0]}')"
python -m pip debug --verbose
示例输出
OS: Linux | Arch: x86_64 | Python: 3.10.12
Compatible tags: 32
  cp310-cp310-manylinux_2_35_x86_64
  cp310-cp310-manylinux_2_31_x86_64
  cp310-cp310-manylinux_2_28_x86_64
  ...
  py3-none-any

记录下输出中的三个核心要素:

  • 操作系统与架构:例如 Linux x86_64、Linux aarch64,或 Windows AMD64。
  • Python 主次版本:例如 Python 3.10(对应 cp310)、Python 3.8(对应 cp38)。
  • 最高兼容标签:例如 manylinux_2_31_x86_64 或 win_amd64,它限定了所能安装的二进制 Wheel 的上限。

三、在联网电脑上准备离线安装包(核心步骤)

初学者最常犯的错误,是在浏览器里只下载了目标包一个单独的文件(例如只下载了 requests-2.31.0-py3-none-any.whl),到离线机上一装立即报错。这是因为几乎所有 Python 库都有下级依赖包(例如 requests 依赖 urllib3、certifi、charset_normalizer、idna)。

正确的做法是使用 pip 的 download 子命令,让 pip 在联网状态下递归计算并下载整棵依赖树。根据联网电脑与离线电脑的环境关系,可分为以下两种情况:

没有网络时怎么离线安装 Python whl 或 tar.gz 包
图 2:联网准备阶段——依赖树解析与跨平台下载执行流程

场景 A:联网电脑与离线电脑环境同构(最简单推荐)

如果两台机器安装了相同或兼容的操作系统(例如同为 Ubuntu 22.04 x86_64 且 Python 版本相同),直接在联网机建立一个空目录并执行:

同构环境下载单个库
mkdir -p offline_packages
pip download requests -d ./offline_packages/
批量下载项目全部依赖
# 如果有现成的 requirements.txt
pip download -r requirements.txt -d ./offline_packages/
示例输出
Collecting requests
  Downloading requests-2.31.0-py3-none-any.whl (62 kB)
Collecting charset-normalizer<4,>=2
  Downloading charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.whl (142 kB)
Collecting idna<4,>=2.5
  Downloading idna-3.7-py3-none-any.whl (66 kB)
Collecting urllib3<3,>=1.21.1
  Downloading urllib3-2.2.1-py3-none-any.whl (121 kB)
Collecting certifi>=2017.4.17
  Downloading certifi-2024.2.2-py3-none-any.whl (163 kB)
Saved ./offline_packages/requests-2.31.0-py3-none-any.whl
Saved ./offline_packages/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.whl
Saved ./offline_packages/idna-3.7-py3-none-any.whl
Saved ./offline_packages/urllib3-2.2.1-py3-none-any.whl
Saved ./offline_packages/certifi-2024.2.2-py3-none-any.whl
Successfully downloaded requests charset-normalizer idna urllib3 certifi

此时可以看到,即使你只要求下载 requests,pip 也自动将 4 个底层依赖全部下载到了 ./offline_packages/ 目录下,形成了一个自包含的离线包集合。

场景 B:联网电脑与离线电脑环境异构(跨平台下载)

若你的联网办公电脑是 macOS (Apple Silicon M系列芯片) 或 Windows,而离线机器是一台 Linux x86_64 服务器,此时如果直接执行普通 download,下载的包往往是当前办公机平台的二进制,拷贝过去必然无法识别。

针对跨平台下载,必须向 pip 提供目标系统的具体规格参数,并且必须加上 --only-binary=:all: 参数:

跨平台下载指定目标环境包
pip download   --only-binary=:all:   --platform manylinux2014_x86_64   --python-version 310   --implementation cp   --abi cp310   -d ./offline_packages/   requests
跨平台下载注意事项

当使用 --platform 跨平台时,pip 无法在当前系统执行编译测试,因此强制要求目标包及其所有依赖都必须拥有预编译的 Wheel 文件(即 --only-binary=:all:)。如果某个库在官方 PyPI 上仅提供了 .tar.gz 源码包而没有提供该平台的 Wheel,跨平台下载就会报错退出。此时最优雅的方案是在联网机上启动一个与目标机器同系统的轻量 Docker 容器来运行场景 A 中的下载命令。

四、在离线机器上执行安装

通过 U 盘、内部跳板机或局域网共享,将整个 offline_packages/ 目录完整拷贝到离线机器的本地磁盘(例如放在 /home/user/offline_packages/)。接下来就可以进行离线安装。

没有网络时怎么离线安装 Python whl 或 tar.gz 包
图 3:离线端安装执行路径与关键参数解析

方式 1:目录级依赖自动装配(强烈推荐的标准命令)

不要一个个按顺序手动去装每个 whl 文件。正确的做法是在离线机器上运行带有 --no-index 和 --find-links 选项的 pip 命令:

离线指定本地目录安装
pip install --no-index --find-links=/home/user/offline_packages/ requests
若有 requirements.txt 批量安装
pip install --no-index --find-links=/home/user/offline_packages/ -r requirements.txt
示例输出
Looking in links: /home/user/offline_packages/
Processing /home/user/offline_packages/requests-2.31.0-py3-none-any.whl
Processing /home/user/offline_packages/certifi-2024.2.2-py3-none-any.whl
Processing /home/user/offline_packages/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.whl
Processing /home/user/offline_packages/idna-3.7-py3-none-any.whl
Processing /home/user/offline_packages/urllib3-2.2.1-py3-none-any.whl
Installing collected packages: urllib3, idna, charset-normalizer, certifi, requests
Successfully installed certifi-2024.2.2 charset-normalizer-3.3.2 idna-3.7 requests-2.31.0 urllib3-2.2.1

这两项参数的作用非常明确:

  • --no-index:命令 pip 完全忽略默认的 PyPI 官方网络索引服务器,严禁发起任何出站网络探测,防止无网导致长时间连接超时。
  • --find-links=<目录路径>:将指定的本地文件夹作为唯一的候选包池。pip 会在该目录下自动分析依赖关系、计算拓扑排序,并按正确的先后顺序一气呵成完成安装。

方式 2:单个 .whl 文件直接安装

如果你安装的是一个本身没有任何第三方依赖的独立轮子(如部分工具包),或者其所有底层依赖已经在系统中提前装好,可以直接指向该文件路径:

直接安装单个 wheel 文件
pip install /home/user/offline_packages/simplejson-3.19.2-cp310-cp310-manylinux_2_5_x86_64.whl
单文件直接安装的隐患

如果直接执行 pip install ./abc.whl 且该包存在未安装的底层依赖,pip 依然会默认尝试联网拉取依赖项。因此即便安装单文件,最好也带上 --no-index --find-links=/home/user/offline_packages/,以便在缺少依赖时能就地在当前目录寻找。

方式 3:.tar.gz 源码包的离线安装

如果你拿到的安装包是源码分发格式(如 .tar.gz 或 .zip),离线安装有两种途径:

途径 3.1:通过 pip 离线直接安装源码包

现代版本的 pip 支持直接指向源码归档文件进行构建并安装:

通过 pip 构建源码包
pip install --no-index --find-links=/home/user/offline_packages/ /home/user/offline_packages/samplepkg-1.0.0.tar.gz
关于构建隔离(Build Isolation)

在新版 pip 中,编译安装源码包时默认会开启“构建隔离(PEP 517)”,这会促使 pip 尝试连接网络创建一个临时的独立编译虚拟环境。如果在离线环境下安装源码包报错提示缺少构建依赖,请追加参数: --no-build-isolation。

途径 3.2:传统手动解压源码安装

如果离线机器没有较新的 pip 或者 pip 本身损坏,可使用 Python 传统的构建脚本:

传统解压手动构建
tar -zxvf samplepkg-1.0.0.tar.gz
cd samplepkg-1.0.0
python setup.py install
源码包安装的刚性限制

如果解压后的代码中包含 C/C++ 扩展(通常可在目录中找到 .c、.cpp 或构建脚本中的 Extension(...) 定义),执行上述安装时系统必须已具备 GCC 或 Clang 编译环境,并安装了对应版本的系统开发包(如 Ubuntu 上的 python3-dev 或 CentOS 上的 python3-devel)。若缺少这些工具,命令会以 gcc: command not found 或 Python.h: No such file or directory 失败。

五、安装结果验证

不要仅凭终端最后一行提示就断定完全就绪,应当在离线终端中实际导入模块,并打印其版本号与具体加载的文件路径,以确认没有发生环境版本污染:

交互式命令验证
python -c "import requests; print('Version:', requests.__version__, '| Path:', requests.__file__)"
示例输出
Version: 2.31.0 | Path: /usr/local/lib/python3.10/site-packages/requests/__init__.py

如果控制台顺利输出版本号和 site-packages 下的具体路径,说明该包及其底层支撑库均已准确就绪,可以正常供工程代码调用。

没有网络时怎么离线安装 Python whl 或 tar.gz 包
图 4:离线安装三大核心报错排查与全流程决策总结

六、离线安装高频疑难排查

1. 报错:Could not find a version that satisfies the requirement ... (from versions: none)

现象与成因:这是离线安装最普遍的错误。虽然添加了 --no-index,但在指定的本地目录中找不到目标包或它所依赖的某一子模块。

处理步骤:阅读报错信息中究竟是哪个包没有满足要求。返回联网电脑,执行 pip download <报错包名> -d ./offline_packages/ 将遗漏的包补齐,再次通过物理介质考入后重试。

2. 报错:xxx.whl is not a supported wheel on this platform

现象与成因:轮子包的文件名命名包含五部分(格式为 distribution-version-python_tag-abi_tag-platform_tag.whl)。离线机器的 pip 拒绝安装不属于本机当前平台或 Python 架构的 Wheel。例如试图把 cp39 的包安装到 Python 3.10 上,或者把 win_amd64 的包安装到 Linux 上。

处理步骤:在离线机上运行 python -m pip debug --verbose 打印出系统支持的所有 Tag 列表。在联网机上下载时,严格对照离线机打印出的 Tag 进行包选择。

3. 报错:Failed to build installable wheels for xxx / error: command 'gcc' failed

现象与成因:目标包是 .tar.gz 源码包且含有 C/C++ 扩展代码,离线系统内没有安装 C 编译器(GCC),或者没有对应版本的 Python 头文件包(python3-dev)。

处理步骤:强烈建议回到联网机上,使用 pip download --only-binary=:all: 命令强行寻找官方编译好的 manylinux 版的 .whl 包;如果该库官方确实没有发布轮子,则需要提前在离线主机通过操作系统包管理器(如 dpkg -i 或 rpm -ivh)把 gcc、make、glibc-devel、python-devel 等离线套件补齐。

4. 极端场景:离线机连 pip 自身都没有安装怎么办?

现象与成因:部分极简或受限的 Linux 生产环境仅有裸机 python3,没有预装 pip 命令。

处理步骤:

  1. 在联网电脑上下载官方引导脚本:curl -O https://bootstrap.pypa.io/get-pip.py。
  2. 在联网机下载 pip 及其基础依赖 wheel:pip download pip setuptools wheel -d ./pip_setup/。
  3. 将上述脚本和 pip_setup 目录拷贝至离线机。
  4. 在离线机运行:python3 get-pip.py --no-index --find-links=./pip_setup/,即可离线初始化安装 pip 工具。

七、总结与最佳操作清单

在无网络环境下进行 Python 环境构建与扩展包安装,只要掌握了以下四步闭环法则,就能彻底避免无休止的报错往返:

  • 第一步(基线勘测):离线机先测 Python 版本、架构和 pip debug 标签。
  • 第二步(整链抓取):联网机用 pip download 递归拉取全部依赖,优先选二进制 .whl 轮子。
  • 第三步(隔绝外网):离线机执行安装务必带上 --no-index --find-links=<目录>,让 pip 自主在本地按序解析依赖。
  • 第四步(终端验证):使用单行 python -c "import ..." 测试关键模块路径,确认生效。
相关专题:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表