web-dev-qa-db-fra.com

install_requires basé sur python

J'ai un module qui fonctionne à la fois sur python 2 et python 3. En Python <3.2, je voudrais installer un package spécifique en tant que dépendance. Pour Python > = 3,2.

Quelque chose comme:

 install_requires=[
    "threadpool >= 1.2.7 if python_version < 3.2.0",
 ],

Comment peut-on faire ça?

41
iTayb

setuptools prend en charge ceci en utilisant marqueurs d'environnement .

install_requires=[
    'enum34;python_version<"3.4"',
    'pywin32 >= 1.0;platform_system=="Windows"'
]

Son utilisation est détaillée dans la documentation officielle . Basé sur le journal des modifications a été ajouté dans la version 20.5, mais l'implémentation n'était pas stable jusqu'à la version 20.8.1 (ce qui n'était qu'un intervalle de 15 jours).


Réponse originale (toujours valide, mais pourrait être obsolète à l'avenir):

setuptools prend en charge cette utilisation dans le extras_require argument.

Le format est le suivant:

extras_require={
    ':python_version=="2.7"': ["mock"],
},

Il supportera les autres opérateurs de comparaison.


Malheureusement, ce n'est pas mentionné dans la documentation . En cherchant des réponses, j'ai trouvé PEP-426 parler de "marqueurs d'environnement". Avec cette phrase, j'ai pu trouver un setuptools ticket avec le commentaire suivant:

J'ai utilisé avec succès la fonction de marqueurs pour exiger sélectivement et déclarativement une dépendance. Voir backports.unittest_mock pour un exemple. Grâce aux "extras", la simulation sera requise, mais uniquement sur Python 2. Lorsque je peux compter sur Setuptools 17.1, je peux changer cette dépendance en python_version < "3.3".

74
unholysampler

Cela a été discuté ici , il semblerait que la méthode recommandée consiste à tester la version Python dans votre setup.py en utilisant sys.version_info;

import sys

if sys.version_info >= (3,2):
    install_requires = ["threadpool >= 1.2.7"]
else:
    install_requires = ["threadpool >= 1.2.3"]

setup(..., install_requires=install_requires)
11
sleepycal