pip download 必须在与目标机器完全一致的环境中执行,包括python版本、操作系统和abi标签,否则下载的包无法安装;需加--recursive递归下载全部依赖,禁用--no-deps和--only-binary=:all:等高危参数,内网安装时必须配合--no-index与--find-links指定本地路径。

pip download 必须在外网同环境执行
离线包进内网装不上,90% 是因为 pip download 没在匹配的环境里跑。它不是“随便下个 whl 就行”,而是要跟目标机器完全一致:Python 版本(如 3.9 vs 3.12)、操作系统(linux_x86_64 vs manylinux2014_x86_64)、ABI(cp39 标签不能错)。在外网用 Python 3.11 下的包,拿去内网 Python 3.9 上装,pip install 直接跳过,报 is not a supported wheel on this platform。
常见错误操作包括:
- 用开发机(macOS)下载,往生产服务器(CentOS 7)上拷 —— 平台标签不兼容
- 在虚拟环境外执行
pip download,结果把系统全局包全拉下来,混入无关依赖 - 没确认目标机器是否启用
manylinux兼容,漏加--platform manylinux2014_x86_64
必须加 --recursive,否则依赖链断在第二层
pip download requests -d ./pkgs 看似简单,但只会下 requests-*.whl,不会自动抓它依赖的 urllib3、certifi,更不会继续抓 urllib3 依赖的 charset-normalizer。进内网一装就报 Could not find a version that satisfies the requirement urllib3。
正确做法是强制递归解析完整依赖树:
- 对单个包:
pip download requests --recursive -d ./pkgs - 对项目清单:
pip download -r requirements.txt --recursive -d ./pkgs - 如果
requirements.txt含 VCS 地址(如git+https://...),必须先手动替换为对应 commit 的 sdist 或删掉 ——pip download不支持离线解析 git 依赖
--no-deps 和 --only-binary=:all: 是高危参数
这两个参数看着省事,实际极易导致安装失败。
--no-deps 会跳过所有依赖下载,只剩主包;--only-binary=:all: 强制只下 whl,但有些包(如 pywin32、psycopg2)在特定平台没有预编译轮子,会直接报错退出,连源码包都不给下。
稳妥策略是:
- 默认不加
--no-deps,让--recursive自动处理依赖 - 若确需规避源码编译(如内网没装 gcc),可加
--only-binary=:all:,但必须提前验证目标包在 PyPI 上是否存在对应平台的 wheel —— 查看https://pypi.org/project/xxx/#files页面的文件名后缀 - 对含 C 扩展的包(如
numpy、pandas),优先用官方预编译 wheel,避免在内网编译失败
内网安装时 --no-index 和 --find-links 缺一不可
只写 pip install *.whl 是错的。它会逐个安装,但不保证依赖顺序,且遇到未下载的子依赖仍会尝试联网。
必须成对使用两个参数:
-
--no-index:彻底禁用 PyPI 索引,断掉任何联网可能 -
--find-links=./pkgs:指定本地搜索路径,让 pip 在该目录下找所有依赖(包括间接依赖)
典型命令是:
pip install --no-index --find-links=./pkgs -r requirements.txt
注意:./pkgs 必须是扁平目录(所有 .whl 和 .tar.gz 都在一层),不能嵌套子文件夹;路径必须写对,相对路径以当前工作目录为准。
最容易被忽略的一点:requirements.txt 里的版本约束(如 numpy>=1.20)会被严格执行。如果下载时某依赖只拿到 1.19,而 requirements.txt 又没锁死版本,pip 会在本地找不到满足条件的包,报错退出 —— 所以导出前最好用 pip freeze 或 pipreqs 生成精确版本列表,而不是靠模糊约束碰运气。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











