Requirements.txt w zależności od wersji Pythona

89

Próbuję przenieść pakiet python2 na python3 (nie mój własny) przy użyciu sześciu, aby był zgodny z obydwoma. Jednak jeden z pakietów wymienionych w require.txt jest teraz zawarty w python3 stdlib, a wersja pypi nie działa w python3, więc chcę go warunkowo wykluczyć. Zrobienie tego w setup.py jest łatwe, mogę po prostu zrobić coś takiego:

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

Chciałbym jednak, aby wymagania.txt również odzwierciedlały poprawną listę. Nie mogę znaleźć nic na ten temat w dokumentacji pip. więc czy ktoś wie, jak to zrobić, czy w ogóle jest to możliwe?

Aqua vitae
źródło
1
Zmień zaakceptowaną odpowiedź na stackoverflow.com/a/33451105/99834 - co jest niewątpliwie właściwym sposobem na wdrożenie tego.
sorin

Odpowiedzi:

133

Możesz użyć znaczników środowiska, aby to osiągnąć, requirements.txtponieważ pip 6.0:

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

Jest również obsługiwany przez setuptools, deklarując dodatkowe wymagania w setup.py:

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

Zobacz także specyfikatory wymagań . Oraz ciągi znaków dla wersji łańcuchowych odpowiednich poleceń Pythona.

Jiangge Zhang
źródło
Ładny! Jak mogę zrobić to samo z sys.platform == "win32"? Próbowałem użyć :sys.platform == "win32", ale setup()funkcja wyświetla błąd „Nieprawidłowy znacznik środowiska”
André Caron
3
Aktualizacja: PEP 496 - Markery środowiskowe zostały zastąpione przez PEP 508 - Specyfikacja zależności dla pakietów oprogramowania Python , która w pełni określa składnię deklaracji zależności, w tym składnię znaczników środowiskowych .
jkdev
10

Możesz utworzyć wiele plików wymagań, umieścić te typowe pakiety we wspólnym pliku i dołączyć je do innego pliku wymagań pip z -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 wymagania / python2.txt

Leonardo.Z
źródło