如何在存在依赖冲突的场景下同时支持多个Python版本
多Python版本依赖兼容最佳方案
第一步:拆分依赖声明,使用PEP 508环境标记适配版本差异
将依赖分两类维护在setup.py中,利用Python版本条件标记自动适配不同环境的依赖要求:
- 核心运行依赖写入
install_requires字段,针对存在版本冲突的依赖添加环境判断:
install_requires = [ # 其余核心依赖省略 "ipdb==0.13.7", # Python 3.6环境适配低版本ipython "ipython>=7.15,<7.17; python_version == '3.6'", # Python 3.7及以上环境适配指定版本ipython "ipython==7.17; python_version >= '3.7'" ]
- 开发专属依赖(测试工具、调试工具等普通用户不需要的依赖)写入
extras_require字段:
extras_require = { "dev": [ # 其余开发依赖省略 "pytest", "flake8" ] }
上述写法是Python官方规定的标准依赖声明规则,pip安装时会自动根据当前环境的Python版本匹配对应的依赖版本,无需人工判断。
第二步:用工具自动生成锁定版本的依赖文件,替代手动pip freeze
你之前担心手动修改pip freeze输出不符合最佳实践的问题,可以通过pip-tools工具解决:
- 新增一个
requirements.in文件,仅需要写一行内容:.[dev],指向setup.py中声明的所有依赖 - 分别在Python 3.6、Python 3.7的干净虚拟环境中执行
pip-compile requirements.in命令,工具会自动生成全版本锁定的依赖文件,你可以分别命名为requirements-py36.txt、requirements-py37.txt - 开发时根据你当前使用的Python版本,执行对应命令即可:
pip install -r requirements-py3x.txt && pip install -e .,依然能保证使用的是经过测试的稳定依赖版本
所有锁定文件都是工具自动生成的,你只需要维护setup.py和requirements.in两份文件即可,没有额外的多文件维护成本。
内容的提问来源于stack exchange,提问作者CIsForCookies
相关产品推荐
相关产品推荐

