Можете ли вы установить условные зависимости для Python 2 и 3 в setuptools?

При выпуске яйца Python с поддержкой как Python 2, так и 3 вы можете указать зависимости, которые изменяются в зависимости от того, какую версию вы используете? Например, если вы используете dnspython для Python 2, существует версия Python 3, которая называется dnspython3.

Можете ли вы написать функцию setuptools.setup() таким образом, чтобы ваше яйцо использовалось для обеих версий, если это единственный 2to3 блок, т. 2to3 Если вы запустили 2to3 чтобы обеспечить совместимость остальной библиотеки с обеими версиями.

Я просмотрел эти документы и не могу найти ответ на этот вопрос:

Ответ 1

Комментарий Богдана помог мне указать на мой путь. Я думал, что опубликую то, что я сделал, если у кого-то еще есть моя проблема.

Для примера в вопросе я сделал именно то, что предложил Богдан:

setup.py

import sys

if sys.version_info[0] == 2:
    dnspython = "dnspython"
elif sys.version_info[0] == 3:
    dnspython = "dnspython3"

setup(
    ... <snip> ...
    install_requires=[
        "%s >= 1.10.0" % dnspython,
    ]
)

Тем не менее, у этой проблемы все еще есть проблема зависимостей pip-style для Travis и tox (я не уверен, почему, учитывая второй комментарий Богдана). Чтобы обойти эту проблему, я создал два дополнительных файла требований, как показано ниже:

Требования-py2.txt

dnspython>=1.10.0

Требования-py3.txt

dnspython3>=1.10.0

Затем для Трэвиса я использовал некоторые переменные среды, которые я почерпнул из торнадо. Travis.yml:

.travis.yml

install:
  - if [[ $TRAVIS_PYTHON_VERSION == 2* ]]; then pip install -r requirements-py2.txt --use-mirrors; fi
  - if [[ $TRAVIS_PYTHON_VERSION == 3* ]]; then pip install -r requirements-py3.txt --use-mirrors; fi

Наконец, для tox я должен был использовать довольно хакерский метод использования этих файлов с несколькими требованиями.

tox.ini

[testenv:py27]
deps = -rrequirements-py2.txt

[testenv:py33]
deps = -rrequirements-py3.txt

Ответ 2

Часть answer.py ответа от @Harold не работала для меня: pip install distribution.whl все еще устанавливает зависимость, которую код if говорит, что это не должно. Я продолжу обновление этого ответа в течение нескольких дней, когда у меня будет эта проблема.

Вот некоторые ссылки, которые могут предоставить дополнительные способы борьбы с этим():