Python3.7环境生成仅支持Python2的wheel包原因咨询
你遇到的这个情况核心是旧版本pip(19.0.3)搭配的构建工具(setuptools/wheel)没有正确识别setup.py里的Python版本限制——尽管你已经明确配置了python_requires和classifiers,但旧工具的逻辑可能受系统中同时存在Python2环境的影响,或者本身对新配置的支持不完善,导致错误标记wheel为Python2兼容。
下面是几个不用升级pip就能解决的办法:
1. 强制指定wheel的Python版本标签
直接在构建命令里用--python-tag参数明确指定目标Python版本,绕过工具的自动识别逻辑:
# 标记为兼容所有Python3版本 python setup.py bdist_wheel --python-tag=py3 # 或者精确标记为仅兼容3.7+ python setup.py bdist_wheel --python-tag=py37
执行后生成的wheel文件名会变成my_library_-py3-none-any.whl或my_library_-py37-none-any.whl,清晰标注Python3兼容。
2. 单独更新setuptools和wheel(不升级pip)
你不想升级pip,但可以单独更新构建依赖的setuptools和wheel——旧版本的这两个工具才是识别错误的关键:
pip install --upgrade setuptools wheel --no-deps
--no-deps参数会阻止pip升级自身,只更新这两个构建工具。更新后重新运行构建命令,工具就能正确读取setup.py里的版本限制了。
3. 在setup.py中强制指定构建所需的wheel版本
在setup.py里添加setup_requires配置,确保构建时使用足够新的wheel版本:
setup( # 你的其他配置项... python_requires='>=3.7', classifiers=[ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", ], setup_requires=['wheel>=0.32.0'] # 指定一个支持Python3标签的wheel版本 )
构建时工具会自动检查并安装指定版本的wheel(如果当前版本过低),从根源上避免版本标签识别错误。
补充说明
旧版本pip(19.0.3)在安装wheel时可能对py3标签的包有兼容性顾虑,但你生成的wheel本身已经正确标记为Python3兼容,其他使用较新pip的用户安装时不会有问题。而你因为要保留Python2.7支持不升级pip的需求,也能通过上述方法满足构建正确wheel的要求。
内容的提问来源于stack exchange,提问作者Chris G

