如何使用 setuptools 将 Python 标记添加到 bdist_wheel 命令?

How do I add a Python tag to the bdist_wheel command using setuptools?

假设我有一个简单的库,它使用 setuptools 进行打包和分发。本例中的库还需要 Python 3.6 的最低版本,这意味着我的 setup.py 将如下所示:

from setuptools import setup, find_packages

setup(
    name='something',
    version='0.0.1',

    description='description',
    long_description=long_description,

    # More metadata

    packages=find_packages(exclude=['tests', 'docs']),

    python_requires='>=3.6'
)

现在,当我 运行 python setup.py bdist_wheel 时,我得到一个名为 something-0.0.1-py3-none-any.whl 的文件。在这里很明显,在确定我的车轮的 Python 标签时,车轮忽略了 setuptools 中的 python_requires 选项(它应该是 py36 但默认为 py3 ).显然,我意识到我可以从命令行传入 --python-tag py36,这将完成这项工作,但是我用于部署我的库的持续部署服务只采用我正在使用的发行版的名称( bdist_wheel)。因此,我无法传递任何命令行参数。

经过一些研究,我发现我可以从 bdist_wheel class 继承并覆盖 python_tag 成员变量,但是根据 wheel README:

It should be noted that wheel is not intended to be used as a library, and as such there is no stable, public API.

因此,我想避免从 bdist_wheel class 继承,这可能会迫使我在每次发生重大更改时重写 class。

有没有其他方法可以通过 setuptools 传递轮子的 Python 标签?

你可以破解类似

if 'bdist_wheel' in sys.argv:
    if not any(arg.startswith('--python-tag') for arg in sys.argv):
        sys.argv.extend(['--python-tag', 'py36'])

但可以说它同样脆弱...

每个 distutils 命令的每个命令行参数都可以保存在设置配置文件中。在 setup.py 所在的同一目录中创建一个名为 setup.cfg 的文件,并将自定义 bdist_wheel 配置存储在其中:

# setup.cfg
[bdist_wheel]
python-tag=py36

现在 运行 python setup.py bdist_wheel 将与 运行 python setup.py bdist_wheel --python-tag py36.

基本相同

distutils 文档中的相关文章:Writing the Setup Configuration File