requirements.txt selon la version de python

89

J'essaie de porter un package python2 vers python3 (pas le mien) en utilisant six pour qu'il soit compatible avec les deux. Cependant, l'un des packages répertoriés dans requirements.txt est maintenant inclus dans la version stdlib python3 et la version pypi ne fonctionne pas dans python3, donc je veux l'exclure conditionnellement. Faire cela dans setup.py est facile, je peux simplement faire quelque chose comme:

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

Mais j'aimerais aussi que requirements.txt reflète la liste correcte. Je ne trouve rien à ce sujet dans la documentation de pip. alors est-ce que quelqu'un sait comment le faire, ou si c'est même possible?

Eau de vie
la source
1
Veuillez modifier la réponse acceptée en stackoverflow.com/a/33451105/99834 - ce qui est sans aucun doute la bonne façon de l'implémenter.
sorin

Réponses:

133

Vous pouvez utiliser les marqueurs d'environnement pour y parvenir requirements.txtdepuis pip 6.0:

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

Il est également pris en charge par setuptools en déclarant des exigences supplémentaires dans setup.py:

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

Voir également les spécificateurs d'exigences . Et des chaînes pour les versions de chaîne des commandes Python correspondantes.

Jiangge Zhang
la source
Agréable! Comment puis-je faire la même chose avec sys.platform == "win32"? J'ai essayé d'utiliser :sys.platform == "win32", mais j'obtiens une erreur "Marqueur d'environnement non valide" de la setup()fonction
André Caron
3
Mise à jour: PEP 496 - Marqueurs d'environnement a été remplacé par PEP 508 - Spécification de dépendance pour les packages logiciels Python , qui spécifie entièrement la syntaxe de déclaration de dépendance, y compris la syntaxe des marqueurs d'environnement .
jkdev
10

Vous pouvez créer plusieurs fichiers d'exigences, placer ces packages communs dans un fichier commun et les inclure dans un autre fichier d'exigences pip avec -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 exigences / python2.txt

Leonardo.Z
la source