You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:19:57