源码兼容但setup.py不兼容Python2.7,能否用Wheel发布跨版本Python包?
问题结论
只要构建流程符合规范,Python 2.7用户直接下载适配的wheel包可以正常运行,无需额外处理。
wheel是预构建的包格式,pip安装wheel时仅执行解压、代码放置到对应库目录的操作,完全不会运行包中的setup.py文件,因此你在setup.py中使用的Python 2不兼容依赖,不会影响已经构建完成的wheel的安装和运行。
只有当用户触发sdist源码包安装流程时,才会执行setup.py触发兼容性报错,常见的触发场景包括:
- 你只上传了sdist源码包到包仓库,没有上传适配Python 2的wheel包
- 你构建的wheel包版本标签错误,Python 2.7环境的
pip无法识别到适配的wheel,自动回退到下载sdist安装
适配方案
优先保证wheel可正常安装
你可以直接构建通用纯Python wheel包,执行构建命令:
python setup.py bdist_wheel --universal也可以在项目根目录的
setup.cfg中添加固定配置,后续执行python setup.py bdist_wheel时自动生成通用包:[bdist_wheel] universal = 1构建出的wheel包标签为
py2.py3-none-any.whl,所有Python版本的pip都会优先识别该适配包,不会回退到sdist安装。构建完成后建议在本地Python 2.7虚拟环境中执行pip install 你的wheel包路径测试安装和核心功能运行,确认无兼容性问题后再发布。兼容sdist源码安装场景(可选)
如果你需要覆盖用户手动下载源码安装、内网环境默认优先安装sdist等场景,可对
setup.py做兼容性改造,仅需修改少量代码即可:- 对不兼容的依赖做条件导入,比如
pathlib可以改成:try: from pathlib import Path except ImportError: # Python 2.7 环境下引入兼容版本pathlib2 from pathlib2 import Path - 在
setup.py的setup配置项中添加对应条件依赖:
其中setup( # 其他原有配置 setup_requires=[ "setuptools<45; python_version < '3.0'", "pathlib2; python_version < '3.4'" ] )setuptools<45是因为45以上版本的setuptools已经停止支持Python 2.7,添加该限制后sdist安装时会自动适配Python 2环境的依赖版本。
- 对不兼容的依赖做条件导入,比如
内容的提问来源于stack exchange,提问作者Otávio Monteagudo
相关产品推荐
相关产品推荐

