Управление зависимостями: для Python2.7 необходим subprocess32

У меня есть библиотека ( subx), которая зависит от subprocess32. Библиотека subprocess32 является бэкпортом для Python2.7 и предоставляет тайм-аут kwarg.

Моей библиотеке нужен тайм-аут kwarg.

Мне нужен subprocess32, только если целевой платформой является Python2.x.

Как мне определить зависимость в моем проекте?

Я получаю это сообщение об ошибке, если я определяю зависимость от subprocess32 через "install_requires" (setup.py) и я внутри python3 virtualenv:

===> pip install -e git+https://github.com/guettli/subx.git#egg=subx
Obtaining subx from git+https://github.com/guettli/subx.git#egg=subx
  Cloning https://github.com/guettli/subx.git to ./src/subx
Collecting subprocess32 (from subx)
  Using cached subprocess32-3.2.7.tar.gz
    Complete output from command python setup.py egg_info:
    This backport is for Python 2.x only.

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-lju3nl1y/subprocess32/

2 ответа

Решение

Существует декларативный способ, но на самом деле он требует более или менее свежей версии setuptools (если я правильно прочитал заметки о выпуске, вам нужна как минимум версия 20.2). То, что вы увидите ниже, называется маркерами среды и указано в PEP 508, прочитайте его, чтобы получить полный список доступных маркеров и лучшее понимание синтаксиса маркеров, если хотите.

Для Python-версии, давайте возьмем ваш пакет в качестве примера: у вас есть subprocess32 зависимость, которая должна быть установлена ​​в python2.X среда. Увеличьте свою зависимость следующим образом:

install_requires=[
    'subprocess32; python_version<"3"',
]

Установка пакета subx с python2.7 теперь дает:

Processing ./dist/subx-2017.8.0-py2-none-any.whl
Collecting subprocess32; python_version < "3" (from subx==2017.8.0)
Installing collected packages: subprocess32, subx
Successfully installed subprocess32-3.2.7 subx-2017.8.0

Если вы установите его с python3.X, результат будет:

Processing ./dist/subx-2017.8.0-py3-none-any.whl
Installing collected packages: subx
Successfully installed subx-2017.8.0

Обратите внимание, что установка subprocess32 будут пропущены


Другим распространенным примером является объявление зависимостей от платформы: у меня есть проект, который требует auditwheel быть установленным в Linux и delocate на MacOS. Я объявляю зависимости следующим образом:

install_requires=[
    ...
    'auditwheel==1.7.0; "linux" in sys_platform',
    'delocate==0.7.1; "darwin" == sys_platform',
]

Обратите внимание, что эта проверка для Linux необходима, если вы специально не нацелены на какую-либо основную версию Python, потому что:

$ python2 -c "import sys; print sys.platform"
linux2

но

$ python3 -c "import sys; print sys.platform"
linux

так что если, например, ваш пакет работает только с python2.X Вы можете использовать чек "linux2" == sys.platform, Это сделает вашу зависимость устанавливаемой только с python2.X,

import sys

kw = {}
if sys.version_info[0] == 2:
    kw['install_requires'] = ['subprocess32']

setup(
    …
    **kw
)
Другие вопросы по тегам