解析器在履行职责
依赖冲突意味着请求的约束没有共同解。最终错误会列出包,但有用信息是迫使他们不兼容的依赖链。运行详细 dry run,读第一个冲突,而不是只看最后一行。
pip install --dry-run -v -r requirements.txt
pipdeptree --warn silence
区分直接固定与共享约束
如果应用固定 libfoo==1.2.0,另一个包要求 libfoo>=1.3,任何解析器都无法同时满足。应把直接固定放宽为范围,或选择支持 1.2 的另一包版本。把共享版本边界放进 constraints 文件,让每个 requirements 文件应用同一规则。
# constraints.txt
libfoo>=1.3,<2
检查 Python 与平台 wheel
某个包可能支持你的 Python 版本,却没有你平台的 wheel,迫使源码构建并失败。检查 pip index versions 和错误中支持的标签。使用受支持的 Python 版本或带 wheel 的平台,而不是强行组合不受支持的版本。
在干净环境验证
开发环境可能已安装兼容包,掩盖了冲突。重建虚拟环境,从修订后的 requirements 安装,运行 pip check 和测试。提交锁文件或 constraints 文件,并让 CI 使用相同 Python 版本。绝不要用 --no-deps 作为修复;它只是把失败推迟到运行时。