install_requires на основе версии Python
У меня есть модуль, который работает как на Python 2, так и на Python 3. В Python<3.2 я хотел бы установить конкретный пакет в качестве зависимости. Для Python>=3.2.
Что-то вроде:
install_requires=[
"threadpool >= 1.2.7 if python_version < 3.2.0",
],
Как это сделать?
2 ответа
setuptools
имеет поддержку для этого с помощью маркеров среды.
install_requires=[
'enum34;python_version<"3.4"',
'pywin32 >= 1.0;platform_system=="Windows"'
]
Использование этого подробно описано в официальной документации. Основанный на изменениях журнал был добавлен в v20.5, но реализация не была стабильной до v20.8.1 (который был только промежутком в 15 дней).
Оригинальный ответ (все еще действителен, но может быть устаревшим в будущем):
setuptools
имеет поддержку для этого в рамках extras_require
аргумент.
Формат следующий:
extras_require={
':python_version=="2.7"': ["mock"],
},
Он будет поддерживать другие операторы сравнения.
К сожалению, это не упоминается в документации. В поисках ответов я обнаружил, что PEP-426 говорит о "маркерах среды". С помощью этой фразы я смог найти билет setuptools со следующим комментарием:
Я успешно использовал функцию маркеров для выборочного и декларативного требования зависимости. Смотрите https://pypi.python.org/pypi/backports.unittest_mock для примера. Через "дополнительные", макет потребуется, но только на Python 2. Когда я могу положиться на Setuptools 17.1, я могу изменить эту зависимость на
python_version < "3.3"
,
Это было обсуждено здесь, и кажется, что рекомендуется проверить версию Python внутри вашей setup.py
с помощью sys.version_info
;
import sys
if sys.version_info >= (3,2):
install_requires = ["threadpool >= 1.2.7"]
else:
install_requires = ["threadpool >= 1.2.3"]
setup(..., install_requires=install_requires)