requirements.txt dependiendo de la versión de Python

89

Estoy intentando portar un paquete python2 a python3 (no el mío) usando seis para que sea compatible con ambos. Sin embargo, uno de los paquetes enumerados en requirements.txt ahora está incluido en python3 stdlib y la versión de pypi no funciona en python3, así que quiero excluirlo condicionalmente. Hacer esto en setup.py es fácil, puedo hacer algo como:

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

Pero me gustaría que requirements.txt refleje la lista correcta también. No puedo encontrar nada sobre esto en la documentación de pip. Entonces, ¿alguien sabe cómo hacerlo, o si es posible?

aquavitae
fuente
1
Cambie la respuesta aceptada a stackoverflow.com/a/33451105/99834 , que sin duda es la forma correcta de implementar esto.
sorin

Respuestas:

133

Puede utilizar los marcadores de entorno para lograr esto requirements.txtdesde pip 6.0:

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

También es compatible con setuptools al declarar requisitos adicionales en setup.py:

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

Consulte también especificadores de requisitos . Y cadenas para las versiones de cadena de los comandos de Python correspondientes.

Jiangge Zhang
fuente
¡Agradable! ¿Cómo puedo hacer lo mismo con sys.platform == "win32"? Intenté usar :sys.platform == "win32", pero obtengo un error de "Marcador de entorno no válido" de la setup()función
André Caron
3
Actualización: PEP 496 - Environment Markers ha sido reemplazado por PEP 508 - Especificación de dependencia para paquetes de software Python , que especifica completamente la sintaxis de declaración de dependencia, incluida la sintaxis de los marcadores de entorno .
jkdev
10

Puede crear varios archivos de requisitos, poner esos paquetes comunes en un archivo común e incluirlos en otro archivo de requisitos pip con -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 requirements / python2.txt

Leonardo.Z
fuente