pip download是离线包准备唯一正确命令,必须用--platform、--python-version、--only-binary=:all:严格匹配目标环境三要素(如cp311-cp311-win_amd64),并配合--no-deps逐个下载或-r批量获取完整依赖树,再通过--no-index与--find-links在内网安装。

pip download 是离线包准备阶段唯一该用的命令,别直接去 PyPI 点 Download files —— 那大概率下到的是 .tar.gz,离线编译基本失败。
怎么下载到真正能用的 .whl 文件?
核心是匹配三要素:Python 解释器版本、ABI 标签、平台架构。比如你在内网服务器上跑的是 Python 3.11 + Windows AMD64,那就要找名字含 cp311-cp311-win_amd64 的 .whl。
- 先在目标机器上运行
pip debug --verbose,看输出里tags行最靠前的那个字符串(如cp311-cp311-win_amd64),这就是你的“黄金标签” - 别信
any.whl—— 纯 Python 包(如requests)可用,但带 C 扩展的(numpy、pandas、pydantic)必须严格匹配,否则import时会报ImportError: DLL load failed或undefined symbol - 用有网机器执行:
pip download --platform win_amd64 --python-version 311 --only-binary=:all: --no-deps requests,其中--no-deps很关键,避免混入不兼容的依赖
为什么 pip install xxx.whl 会报 “requires X >= Y” 错误?
因为离线环境不会自动拉依赖,pip install 只装你给的这一个文件,不管它背后要什么。报错不是你下错了包,而是缺子依赖。
- 错误示例:
ERROR: requests requires urllib3 >= 1.21.1, but you'll have urllib3 1.20—— 这说明你本地已有旧版urllib3,但没把新版urllib3的.whl一起带进来 - 正确做法:用
pip download --no-deps -r requirements.txt先生成完整依赖列表,再对每个包单独加--platform和--python-version参数批量下载 - 所有
.whl放进同一文件夹(如wheels/),然后执行:pip install --find-links ./wheels/ --no-index --upgrade --force-reinstall requests,--no-index强制禁用远程源,--force-reinstall防止跳过已存在但版本低的包
安装后 import 失败的常见原因
装完 pip list 看得到包名 ≠ 能用。很多问题出在 ABI 或路径隐性冲突上。
-
ImportError: DLL load failed(Windows):90% 是cp311下成cp311m或漏了vcruntime140.dll—— 检查.whl文件名是否含m(表示启用了 pymalloc),不匹配就重下 -
ModuleNotFoundError却没报版本冲突:可能装到了错误 Python 环境(比如系统 Python 而非你激活的 venv),用python -m pip install替代裸pip install可规避 - 装完
numpy却import numpy报Illegal instruction (core dumped):说明 CPU 不支持该.whl编译时启用的指令集(如 AVX2),得换更通用的构建(比如从 Gohlke 预编译库 下)
pip 命令默认指向哪个解释器,必须用 python -m pip 显式指定,否则离线包可能装进完全无关的 site-packages 目录。


















