Как мне создать пакет колеса py2, когда setup.py работает с интерпретатором Python версии 3? - PullRequest
0 голосов
/ 04 марта 2019

У меня есть пакет, который должен быть 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 2, при запуске setuptools с интерпретатором Python 3?Это вообще возможно?Означает ли -py3- / -py2 в имени файла нечто иное, чем я думаю?

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Попробуйте передать аргумент тега python в bdist_wheel:

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

Также его можно передать как

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

Или в setup.cfg

0 голосов
/ 04 марта 2019

Изменено с Как заставить колесо питона быть специфичным для платформы при его создании? , это изменение на 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 ant pure на True.

Edit2:

Другое возможное решение:

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(
    # ...
)
...