Управление зависимостями: для 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
)