requirements.txt в зависимости от версии Python


89

Я пытаюсь перенести пакет python2 на python3 (не свой собственный), используя шесть, чтобы он был совместим с обоими. Однако один из пакетов, перечисленных в requirements.txt, теперь включен в stdlib python3, а версия pypi не работает в python3, поэтому я хочу условно исключить ее. Сделать это в setup.py просто, я могу просто сделать что-то вроде:

if sys.version_info[0] == 2:
    requirements += py2_requirements
else:
    requirements += py3_requirements

Но я бы хотел, чтобы в файле requirements.txt тоже был правильный список. Я не могу найти ничего по этому поводу в документации по протоколу. так кто-нибудь знает, как это сделать, или возможно ли это вообще?


1
Пожалуйста, измените принятый ответ на stackoverflow.com/a/33451105/99834 - это, несомненно, правильный способ реализовать это.
sorin

Ответы:


133

Вы можете использовать маркеры среды для достижения этой цели в requirements.txtтак pip 6.0:

SomeProject==5.4; python_version < '2.7'
SomeProject; sys_platform == 'win32'

Он также поддерживается setuptools путем объявления дополнительных требований в setup.py:

setup(
    ...
    install_requires=[
        'six',
        'humanize',
    ],
    extras_require={
        ':python_version == "2.7"': [
            'ipaddress',
        ],
    },
)

См. Также спецификаторы требований . И строки для строковых версий соответствующих команд Python.


Ницца! Как я могу сделать то же самое с sys.platform == "win32"? Я пробовал использовать :sys.platform == "win32", но получаю ошибку «Недопустимый маркер среды» от setup()функции
Андре Карон,

3
Обновление: PEP 496 - Маркеры среды заменены PEP 508 - Спецификация зависимостей для пакетов программного обеспечения Python , которая полностью определяет синтаксис объявления зависимостей, включая синтаксис для маркеров среды .
jkdev

10

Вы можете создать несколько файлов требований, поместить эти общие пакеты в общий файл и включить их в другой файл требований pip с помощью -r file_path

requirements/
  base.txt
  python2.txt
  python3.txt

python2.txt:

-r base.txt
Django==1.4 #python2 only packages

python3.txt:

-r base.txt
Django==1.5 #python3 only packages

pip install -r требования / python2.txt

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.