最稳定方式是pip install --find-links + 本地.whl目录;需先在有网环境用pip download -p --only-binary=:all: -d下载全依赖包,离线时用--find-links ./wheels --no-index批量安装。

怎么在离线服务器上批量安装 Python 库
直接结论:用 pip install --find-links + 本地 .whl 目录是最稳定、最可控的批量部署方式,比手动一个个 pip install xxx.whl 强得多,也比改 --index-url 指向私有源更轻量。
为什么不能只用 pip install xxx.whl
单独装单个 .whl 看似简单,但实际会卡在依赖上——比如你下了 requests-2.31.0-py3-none-any.whl,它依赖 urllib3、charset-normalizer 等,而这些依赖没提前下好,pip install requests-2.31.0-py3-none-any.whl 就会报错:ERROR: Could not find a version that satisfies the requirement urllib3>=1.21.1(因为 pip 默认仍尝试联网找依赖)。
- 必须加
--no-deps才能跳过依赖检查,但这样装出来的库大概率无法 import - 不加
--no-deps,pip 就会试图联网解析依赖,失败后直接退出 - 逐个手动 resolve 依赖链极其耗时,且不同版本间存在兼容性陷阱(如
numpy和scipy的 ABI 匹配)
怎么生成完整、可离线安装的 .whl 包集合
核心动作是在有网环境预下载所有依赖(含传递依赖),并确保平台标签一致(比如目标服务器是 manylinux2014_x86_64,就不能下 win_amd64 的包)。
- 用
pip download而不是pip wheel:前者直接拉官方编译好的.whl,后者要本地编译,离线服务器通常没编译环境 - 指定平台和 Python 版本:
pip download -p manylinux2014_x86_64 -c constraints.txt --python-version 39 --only-binary=:all: -d ./wheels requests pandas -
constraints.txt用来锁定关键库版本(如numpy==1.23.5),避免因默认最新版引发 ABI 不兼容 - 务必加
--only-binary=:all:,禁用源码包(.tar.gz),否则离线时 pip 会卡在找不到setup.py编译器
离线服务器上如何一键批量安装
把下载好的整个 wheels/ 目录拷到离线服务器后,用 --find-links + --no-index 让 pip 完全从本地目录解析依赖关系:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
立即学习“Python免费学习笔记(深入)”;
pip install --find-links ./wheels --no-index --trusted-host None -r requirements.txt
其中:
-
--find-links ./wheels告诉 pip 在该目录里搜所有可用的.whl -
--no-index彻底禁用 PyPI,防止意外触发网络请求 -
--trusted-host None是保险项(某些旧版 pip 在--no-index下仍可能校验 host) -
requirements.txt只写顶层依赖(如requests==2.31.0),不用列传递依赖——pip 会自动从wheels/里匹配满足条件的版本
注意:如果 requirements.txt 里写了 git+ 或 file:// 这类非标准源,必须提前转成固定版本号再下载,否则离线时无法处理。
最容易被忽略的是平台标签和 Python ABI 的严格匹配——哪怕只是把 cp39-cp39-manylinux2014_x86_64.whl 错下成 cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl,pip 也可能跳过它去报错,而不是提示“找不到合适版本”。建议用 pip debug --verbose 查清目标环境支持的标签,再对应下载。

















