装包慢不一定要换网络,多数时候是没走镜像;而“锁定版本”也不等于“可复现”。

镜像配置的三种层级

# ① 临时指定(单次)
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 变了也可能出问题。

为什么“锁了版本还是不一样”

  1. 平台差异:numpy 之类的 wheel 按平台/架构不同,锁的是版本不是产物。
  2. 未锁哈希:--require-hashes 才能真正校验内容。
  3. 依赖解析器不同:pip 新旧版本的解析策略不同,同一份宽松约束可能解出不同结果 → 所以要用锁文件而不是“文本里的版本范围”。
  4. 缓存干扰:pip cache dir / --no-cache-dir 对比一下。

排查装包问题的顺序

pip config list          # 当前镜像配置来自哪
pip -v install requests  # 看它实际请求了哪个 URL
pip debug --verbose      # 看当前解释器支持的 wheel 标签

经验:pip config list + pip -v install 这两条能覆盖八成“装不上/装错源”的问题。先看它到底在问谁要包,再怀疑网络。