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)
Другие вопросы по тегам