当setup.py与Python版本3解释器一起运行时,如何构建py2 wheel软件包?

时间:2019-03-04 17:14:06

标签: python setuptools packaging python-wheel

我有一个仅应为Python 版本2 的软件包,但需要使用版本3解释器进行构建。

此软件包的setup.py看起来像是热门歌曲:

from setuptools import setup

setup(
    python_requires="<3.0, >=2.7.5",
    classifiers=[
        'Programming Language :: Python :: 2',
        'Intended Audience :: Developers',
    ],
    # ... more keyword arguments ... 
 )

如果我致电python2 setup.py build bdist_wheel,我会得到:

$ ls dist
mypackage-0.3.dev14-py2-none-any.whl

如果我使用版本3解释程序(即python3 setup.py build bdist_wheel)运行它,则会得到:

$ ls dist
mypackage-0.3.dev14-py3-none-any.whl

我希望无论解释器版本如何,我都会得到一个py2包,因为我是用python_requires(以及在标记中)指定的。我的软件包构建服务器只有一个Python 3解释器。

在使用Python 3解释器运行setuptools时,如何构建针对Python 2的轮子?那有可能吗?文件名中的-py3- / -py2的含义与我认为的有所不同吗?

2 个答案:

答案 0 :(得分:2)

How to force a python wheel to be platform specific when building it?修改后,此更改为setup.py似乎可行。

但是我怀疑可能没有那么简单。

from setuptools import setup

try:
    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  # Mark us as not a pure python package

        def get_tag(self):
            python, abi, plat = _bdist_wheel.get_tag(self)
            python, abi = 'py2', 'none'  # python, abi, plat = 'py2', 'none', 'any'  
            return python, abi, plat
except ImportError:
    bdist_wheel = None

setup(      
    cmdclass={'bdist_wheel': bdist_wheel}
    # ... other keyword args ...
)

编辑:

使用此解决方案,平台(plat)似乎发生了变化,因为生成的文件名以-py2-none-linux_x86_64.whl结尾。

我怀疑是self.root_is_pure = False的结果。由于我的软件包中没有二进制文件,因此我认为将平台设置为any蚂蚁纯为True是安全的。

编辑2:

另一种可能的解决方案:

import sys
import setuptools

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

setuptools.setup(
    # ...
)

答案 1 :(得分:2)

尝试将python-tag参数传递给bdist_wheel:

python setup.py bdist_wheel --python-tag=py2

它也可以作为

传递
from setuptools import setup
setup(options={'bdist_wheel':{'python_tag':'py2'}})

或者在setup.cfg