pip-tools 通过 requirements.in 编译出锁定版 requirements.txt,确保环境一致;需手动维护直接依赖、写最小兼容版本、分环境管理输入文件;pip-compile 常用参数包括 --output-file、--upgrade 和 --no-upgrade-package。

pip-tools 能帮你把 requirements.in 里写的“高层依赖”(比如 requests>=2.25)编译成锁定版本的 requirements.txt,确保每次安装都拉取完全相同的包和子依赖。它不是替代 pip install 的工具,而是解决“为什么我在本地能跑、CI 上却报错”的关键一环。
怎么写好 requirements.in?别直接 pip freeze
你得手动维护 requirements.in,只写你**直接用到**的包,不写间接依赖。否则锁定文件会失去可读性和可维护性。
- 写明最小兼容版本即可,例如:
django>=4.2、click~=8.1,避免写死django==4.2.10 - 不要在
requirements.in里 include 其他文件(如-r base.txt),pip-tools 对这类语法支持不稳定,容易漏依赖或重复解析 - 如果项目分环境(dev/prod),建议用不同输入文件:比如
requirements.in(生产)和requirements-dev.in(开发),再分别生成对应锁定文件
pip-compile 命令的关键参数有哪些?
pip-compile 是 pip-tools 的核心命令,它读 .in 文件,输出锁定版 .txt。默认行为往往不够用,这几个参数最常改:
- 用
--output-file=requirements.txt指定输出路径,否则默认输出到同名.txt - 加
--upgrade才会尝试升到满足约束的最新版;不加的话,只更新已存在但过期的包,其余保持原锁定版本 - 想跳过某些包的版本收缩(比如你明确要
pydantic 但 pip-tools 总想升到 2.x),用 <code>--no-emit-trusted-host没用,正确做法是加--allow-unrelated或临时注释掉冲突行再重编译 - 若项目用了
pyproject.toml中的[build-system],注意 pip-tools 默认不读它;需要显式传--config-settings editable-verbose=true这类参数时,得确认 pip-tools 版本 ≥ 7.3.0
为什么 pip-sync 安装后还是有版本漂移?
pip-sync 本该严格按 requirements.txt 安装/卸载,但常见漂移来自三个地方:
- 执行
pip-sync时当前环境已有其他包(比如之前用pip install flask手动装过),它不会主动卸载未在.txt列出的包 —— 加--delete-missing才会清理 - 某些包(如
setuptools、wheel)被 pip 自身依赖,pip-sync默认跳过它们;若需控制,得在.txt里显式写出并加--trusted-host参数处理私有源 - Windows 上若
requirements.txt含平台限定标记(如; platform_system == "Linux"),而你在 Windows 运行pip-sync,那些行会被忽略,导致实际安装集与预期不符
真正的确定性不只靠工具链,还取决于你是否坚持“所有直接依赖都进 .in、所有安装都走 pip-sync、CI 和本地用同一份锁定文件”。少一个环节,pip-tools 就只是个更花哨的 pip freeze。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











