如何用pip wheel生成适配CP39与Windows10的Python包
我创建了一个包含二进制组件且依赖Windows 10平台的Python包,已在setup.py中添加以下分类器指定目标平台与环境:
classifiers=( "Development Status :: 5 - Production/Stable", "Environment :: Console", "License :: Other/Proprietary License", "Operating System :: Microsoft :: Windows :: Windows 10", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Scientific/Engineering :: Medical Science Apps." )
我期望使用Python 3.9执行pip wheel mypack-1.0.0.zip命令时,工具会遵循这些分类器生成适配指定平台的wheel包,但实际得到的包名为:
mypack-1.0.0-py3-none-any.whl
而我预期的包名应为:
mypack-1.0.0-cp39-cp39-win32.whl
或类似格式。
我了解到setup.py中的classifier字段并无严格定义,虽有常用分类器列表,但这并未解决问题。
如何配置才能让pip wheel生成符合setup.py中指定的平台与Python版本限制的包?
分类器仅作为元数据用于包发现(比如PyPI搜索过滤),不会直接影响wheel的平台/版本标签生成。要生成符合预期的平台特异性wheel,需通过以下配置实现:
1. 限制Python版本
在setup.py的setup()函数中添加python_requires参数,明确指定仅支持Python 3.9:
setup( # 其他已有配置 python_requires=">=3.9,<3.10", classifiers=classifiers, # ... )
2. 标记包为非纯Python包
因为你的包包含二进制组件,必须告诉构建工具这不是纯Python包:
方法A:自定义bdist_wheel命令
继承wheel的构建类,强制标记为非纯包:
from setuptools import setup from wheel.bdist_wheel import bdist_wheel as _bdist_wheel class bdist_wheel(_bdist_wheel): def finalize_options(self): _bdist_wheel.finalize_options(self) self.root_is_pure = False # 关键:标记为含平台相关内容的包 setup( # 其他已有配置 cmdclass={'bdist_wheel': bdist_wheel}, # ... )
方法B:通过扩展模块声明
如果你的二进制组件是C/C++扩展,直接在setup.py中声明ext_modules,setuptools会自动识别为非纯包:
from setuptools import setup, Extension # 示例:声明一个C扩展模块 my_extension = Extension( 'mypack.my_ext', sources=['src/my_ext.c'], ) setup( # 其他已有配置 ext_modules=[my_extension], # ... )
3. 指定目标平台(可选)
添加platforms参数明确目标平台,避免歧义:
setup( # 其他已有配置 platforms=["win32"], # 若为64位Windows则用"win_amd64" # ... )
4. 正确构建wheel
确保在Windows 10 + Python 3.9的环境中执行构建命令:
# 直接从源码构建 python setup.py bdist_wheel # 或用pip从zip包构建 pip wheel mypack-1.0.0.zip
此时生成的wheel会自动带上对应平台标签(如cp39-cp39-win32.whl或cp39-cp39-win_amd64.whl)。
关键说明
wheel的平台/版本标签由构建环境和包的纯属性共同决定:
- 若包被标记为纯Python包(
root_is_pure=True),会生成py3-none-any.whl - 非纯包的标签会匹配构建环境的Python版本(如cp39)和操作系统架构(如win32)
内容的提问来源于stack exchange,提问作者Georg W.

