Python包依赖已写入setup.cfg,分发时还需要提供requirements.txt吗?
关于Python分发包是否需要额外提供requirements.txt的解答
核心结论
你当前仅用setup.cfg+pyproject.toml配置依赖的方案完全符合Python现代打包规范,提供requirements.txt不是硬性要求,是否需要额外提供完全取决于你的使用场景。
install_requires和requirements.txt的定位差异
setup.cfg里的install_requires属于运行时依赖声明:只声明你的包正常运行需要的最小兼容范围,安装时pip会根据用户当前的Python版本、已有环境自动适配符合范围的最高可用版本,天然规避了你担心的「高版本环境生成的锁定依赖不兼容低Python版本」的问题,这个配置对普通终端用户是完全够用的。requirements.txt属于全版本锁定的依赖清单:默认会包含所有直接依赖、间接依赖的具体版本号,核心作用是保证环境的100%可复现。
提供requirements.txt的适用场景与好处
如果你的项目符合以下情况,额外提供对应依赖清单会有明显收益:
- 有外部开发者参与项目维护:你可以把开发、测试所需的额外依赖(比如
pytest、flake8、sphinx等不会随包分发的工具类依赖)也写入依赖文件,所有贡献者执行pip install -r requirements.txt就能得到和你完全一致的开发测试环境,避免环境差异导致的测试不通过问题。 - 需要提供可复现的生产/演示环境:如果你要给用户提供开箱即用的部署参考、或者配套的演示案例,锁定版本的依赖清单可以保证用户安装的依赖和你验证过的版本完全一致,不会因为依赖的破坏性变更导致功能异常。
- 面向有特殊合规/部署要求的用户:针对需要离线部署、依赖版本全溯源的企业级用户,提前提供对应Python版本的锁定依赖文件,可以降低用户的适配成本。
跨Python版本的兼容方案
你不需要手动在单个Python版本下生成依赖文件,可以使用pip-tools的pip-compile工具,针对不同Python版本分别生成对应依赖清单,命名为requirements-py36.txt、requirements-py38.txt这类格式即可,工具会自动识别对应Python版本支持的依赖版本,不会出现版本不兼容的问题。
内容的提问来源于stack exchange,提问作者Sriram
相关产品推荐
相关产品推荐

