2014-01-13 3 views
21

У меня есть модуль, который работает как на python 2, так и на python 3. В Python < 3.2 Я хотел бы установить конкретный пакет в качестве зависимости. Для Python> = 3.2.install_requires на основе версии python

Что-то вроде:

install_requires=[ 
    "threadpool >= 1.2.7 if python_version < 3.2.0", 
], 

Как можно сделать это?

+0

Возможный дубликат [установить \ _requires в setup.py в зависимости от установленной версии Python] (https://stackoverflow.com/questions/6080646/install-requires-in-setup-py-depending-on- installed-python-version) – ederag

ответ

35

setuptools поддерживает это с помощью environment markers.

install_requires=[ 
    'enum34;python_version<"3.4"', 
    'pywin32 >= 1.0;platform_system=="Windows"' 
] 

Использование этого подробно описано в official documentation. Основываясь на change log, был добавлен в версии 20.5, но реализация была нестабильной до v20.8.1 (это был всего лишь разрыв 15 дней).


Оригинал ответа (остается в силе, но может быть устаревшими в будущем):

setuptools поддерживает это, используя в extras_require аргумента.

Формат следующий:

extras_require={ 
    ':python_version=="2.7"': ["mock"], 
}, 

Он будет поддерживать другие операторы сравнения.


К сожалению, он не упоминается в documentation. При поиске ответов я нашел PEP-426, говоря о «маркерах окружающей среды». С этой фразой я был в состоянии найти setuptools ticket со следующим комментарием:

я успешно использовал маркеры имеют для селективных и декларативно требует зависимости. См. Пример backports.unittest_mock. Через «дополнительные функции» требуется mock, но только на Python 2. Когда я могу положиться на Setuptools 17.1, я могу изменить эту зависимость на python_version < "3.3".

+1

Это правильный ответ, кстати, рекомендуется, чтобы более старые версии python (например, 2.7.6) выдавали ошибки, потому что их версия 'setuptools' не распознает этот синтаксис. Поэтому, если вам нужна больше совместимости, используйте более переносимую версию, например, предложенную @iTayb. –

+1

Кто-нибудь знает использование «:» перед «python_version»? Это где-то задокументировано? – AXO

+0

Какова самая ранняя версия setuptools, которая поддерживает этот маркер? – AXO

9

Об этом было сообщено here. По-видимому, рекомендуемым способом является проверка версии 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) 
+4

Это решение является хрупким с множеством комбинаций пакетов 'pip' и' wheel'. Когда pip формирует колеса от вашего имени, вычисленный список install_requires записывается в метаданных колеса, а затем кешированное колесо может использоваться в другой версии Python. –

Смежные вопросы