能否针对setup.py的install_requires使用pip-compile锁定依赖?
核心结论
完全可以。pip-compile原生支持直接读取setup.py内install_requires字段声明的依赖完成版本锁定,最终生成的锁文件和基于requirements.in生成的效果完全一致,保留完整的依赖引入溯源信息,不需要额外维护独立的requirements.in文件。
使用方式
你只需要在存放setup.py的项目根目录下直接执行pip-compile命令即可(请使用6.0及以上版本的pip-tools,低版本对setup.py的自动识别支持不完善)。工具会自动按优先级识别当前目录下的依赖配置:pyproject.toml > setup.cfg > setup.py,读取到install_requires的内容后自动完成全量依赖解析、版本锁定。
生成的requirements.txt头部会明确标注锁文件的来源为对应setup.py,每一条依赖条目后都会通过注释标注它的引入链路,比如是你在setup.py里直接声明的顶层依赖,还是某个顶层依赖拉取的传递依赖,溯源能力和基于requirements.in的场景没有任何差异。
几个常用的适配场景操作:
- 如果你需要同时锁定
setup.py里extras_require定义的可选依赖组(比如dev、test这类开发依赖组),追加--extra参数指定组名即可,例如pip-compile --extra dev --extra test - 如果你希望锁文件包含当前项目本身的可编辑安装配置,后续直接执行
pip install -r requirements.txt就能完成开发态的项目安装,可以加上-e .参数,例如pip-compile --extra dev -e . - 如果你想显式指定依赖来源就是setup.py,避免工具误识别目录下其他配置文件,可以直接把setup.py作为参数传给命令:
pip-compile setup.py
日常使用注意点
- 不要手动编辑生成的
requirements.txt里的版本号、溯源注释,后续需要调整顶层依赖时,直接修改setup.py里的install_requires内容,重新执行pip-compile就会自动更新锁文件,溯源链路也会同步刷新。 - 这套工作流同样兼容
pip-sync命令,可以一键把本地虚拟环境的依赖版本和锁文件对齐,和使用requirements.in的操作逻辑完全一致。 - 如果后续项目迁移到PEP 621标准,改用
pyproject.toml的[project] dependencies字段声明依赖,pip-compile的适配逻辑和操作方法和setup.py场景完全相同,不需要调整工作流。
内容的提问来源于stack exchange,提问作者Intrastellar Explorer
相关产品推荐
相关产品推荐

