装包慢不一定要换网络,多数时候是没走镜像;而“锁定版本”也不等于“可复现”。
镜像配置的三种层级
# ① 临时指定(单次)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
# ② 用户级(推荐,不影响系统)
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# ③ 项目级(随仓库走,团队一致)
# 项目根建 pip.conf / pip.ini,或用环境变量
export PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple
常用镜像:清华 pypi.tuna.tsinghua.edu.cn、阿里云 mirrors.aliyun.com/pypi/simple、腾讯云 mirrors.cloud.tencent.com/pypi/simple。
注意:镜像同步有延迟。刚发布的版本在镜像上可能还不存在,报 No matching distribution found 时先换官方源确认。
requirements.txt 与 lock 的分工
| 文件 | 内容 | 谁维护 |
|---|---|---|
requirements.txt |
直接依赖,可宽松(requests>=2.31) |
人 |
requirements.lock |
含间接依赖的精确版本 + 哈希 | 工具生成 |
# 生成锁文件(二选一)
pip freeze > requirements.lock
pip-compile requirements.in -o requirements.lock # pip-tools,更干净
只锁直接依赖是不够的:requests 不变,它依赖的 urllib3 变了也可能出问题。
为什么“锁了版本还是不一样”
- 平台差异:
numpy之类的 wheel 按平台/架构不同,锁的是版本不是产物。 - 未锁哈希:
--require-hashes才能真正校验内容。 - 依赖解析器不同:pip 新旧版本的解析策略不同,同一份宽松约束可能解出不同结果 → 所以要用锁文件而不是“文本里的版本范围”。
- 缓存干扰:
pip cache dir/--no-cache-dir对比一下。
排查装包问题的顺序
pip config list # 当前镜像配置来自哪
pip -v install requests # 看它实际请求了哪个 URL
pip debug --verbose # 看当前解释器支持的 wheel 标签
经验:
pip config list+pip -v install这两条能覆盖八成“装不上/装错源”的问题。先看它到底在问谁要包,再怀疑网络。
