requisitos.txt dependendo da versão do python

91

Estou tentando portar um pacote python2 para python3 (não meu) usando seis para que seja compatível com ambos. No entanto, um dos pacotes listados em requirements.txt agora está incluído no python3 stdlib e a versão pypi não funciona no python3, portanto, desejo excluí-lo condicionalmente. Fazer isso em setup.py é fácil, posso apenas fazer algo como:

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

Mas eu gostaria que o arquivo requirements.txt também refletisse a lista correta. Não consigo encontrar nada sobre isso na documentação do pip. então, alguém sabe como fazer, ou se é mesmo possível?

aquavitae
fonte
1
Altere a resposta aceita para stackoverflow.com/a/33451105/99834 - que é, sem dúvida, a maneira certa de implementar isso.
sorin

Respostas:

140

Você pode usar os marcadores de ambiente para conseguir isso requirements.txtdesde pip 6.0:

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

Também é compatível com ferramentas de configuração, declarando requisitos extras em setup.py:

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

Veja também especificadores de requisitos . E Strings para as versões de string dos comandos Python correspondentes.

Jiangge Zhang
fonte
Agradável! Como posso fazer o mesmo com sys.platform == "win32"? Tentei usar :sys.platform == "win32", mas recebo um erro "Marcador de ambiente inválido" da setup()função
André Caron
3
Atualização: PEP 496 - Marcadores de ambiente foi substituído por PEP 508 - Especificação de dependência para pacotes de software Python , que especifica totalmente a sintaxe de declaração de dependência, incluindo a sintaxe para marcadores de ambiente .
jkdev
11

Você pode criar vários arquivos de requisitos, colocar esses pacotes comuns em um arquivo comum e incluí-los em outro arquivo de requisitos pip com -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 requisitos / python2.txt

Leonardo.Z
fonte