如何创建一个纯Python的wheel包

11
从以下的 setup.py 文件中,我试图创建一个仅包含 Python 2.7 代码的项目的纯 Python 轮子。
from setuptools import setup

setup(
    name='foo',
    version='0.0.1',
    description='',
    url='',
    install_requires=[
        'bpython',
        'Django==1.8.2',
    ],
)
然而,当我运行python setup.py bdist_wheel时,生成的wheel文件是平台特定的foo-0.0.1-cp27-none-macosx_10_9_x86_64.whl文件,而不是期望的foo-0.0.1-cp27-none-any.whl。当我尝试在不同的平台上安装此wheel时,会失败并提示与Python不兼容
我需要更改setup.py文件或者Python解释器吗? 这样才能使得这个wheel文件在任何平台上都可以使用?

我注意到当我使用下面提到的 --universal 标志创建软件包时,会同时创建一个 bdist.macosx-10.7-x86_64 目录和一个 <my_package>-py2.py3-none-any.whl 文件。 (我的包是通用的2/3,不特定于平台)。我想知道当所有操作正常运行时,这是否应该发生,还是它们都应该以 ...-py2.py3-none-any.whl 结尾。有人知道吗? - Mike Williamson
3个回答

11

简单的方法是在命令行中添加--universal,您可以从运行python setup.py bdist_wheel --help中看到:

  --universal       make a universal wheel (default: false)

你也可以在 setup.py 文件旁边添加一个 setup.cfg 文件来处理这个问题:

[bdist_wheel]
universal = 1

如果你不想再有一个配置文件覆盖了你的软件包,你可以在调用 setup() 之前,在你的 setup.py 中编写这样一个文件,并在该调用返回后删除它,这是我在共享的setup.py中为我所有 PyPI 项目所做的事情,例如在ruamel.yaml中使用。


1
问题并不在于如何制作通用轮。 - wim

4

文件名的这一部分由 bdist_wheel 选项控制,该选项称为 Python 标签

python2 setup.py bdist_wheel --help | grep python-tag
  --python-tag      Python implementation compatibility tag (default: 'py2')

然而,默认情况下通常是'py2'(或'py3'用于Python3运行时),所以要获取特定于平台的wheel,您必须在配置中有其他未在问题中显示的内容。
无论如何,您可以在设置文件中明确指定标签:
from setuptools import setup

setup(
    name="foo",
    version="0.0.1",
    ...
    options={"bdist_wheel": {"python_tag": "cp27"}},
)

这个配置将创建一个名为foo-0.0.1-cp27-none-any.whl的wheel。


2

将分类器字段添加到我的setup.py文件中解决了这个问题。

from setuptools import setup

setup(
    name='foo',
    version='0.0.1',
    description='',
    url='',
    classifiers=[
        'Programming Language :: Python :: 2.7',
    ],
    install_requires=[
        'bpython',
        'Django==1.8.2',
    ],
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接