9
votes

Setuptools doit-il figurer dans l'entrée setup_requires des fichiers setup.cfg en Python?

Le backport importlib_resources pour Python <3.7 du module de bibliothèque standard importlib.resources a la section suivante dans le fichier setup.cfg:

$ python -V
Python 3.8.0
$ pip list
Package    Version
---------- -------
pip        19.2.3
setuptools 41.2.0
WARNING: You are using pip version 19.2.3, however version 19.3.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.

Pourquoi setup_requires inclut-il setuptools ? Cela ne semble pas logique puisque:

  • la première ligne du fichier setup.py importe setuptools , donc au moment où la fonction setup est appelée et lit le fichier setup.cfg qui demande d'installer setuptools il est déjà trop tard pour installer setuptools :

    from setuptools import setup
    setup()
    
  • setuptools est déjà installé sur toute nouvelle installation de Python (enfin, testé uniquement sur Windows 10 et MacOS 10.15 avec Python 3.8.0):

    [options]
    python_requires = >=2.7,!=3.0,!=3.1,!=3.2,!=3.3
    setup_requires =
        setuptools
        wheel
    install_requires =
        pathlib2; python_version < '3'
        typing; python_version < '3.5'
    packages = find:
    


4 commentaires

Python est également inclus dans chaque nouvelle installation de python, et pourtant il est là ...


@MadPhysicist python_requires a une sémantique différente: ce n'est pas pour installer Python, c'est pour empêcher pip d'installer une distribution pour la mauvaise version de Python (voir packaging.python.org/guides/… ).


Cela n'a aucun sens. Ni setup_requires ni install_requires sont des mots clés standard et ne seront pas reconnus par distutils ; ils ont une signification pour setuptools uniquement. Un test simple: python -c "from distutils.core import setup; setup(install_requires=['foo'])" --version crachera une UserWarning: Unknown distribution option: 'install_requires' . Cela signifie que si setuptools n'est pas installé, setup_requires n'aura aucun effet; il est donc inutile de le lister dans les dépendances.


setuptools n'est pas installé sur Python par défaut. Il peut être installé dans certaines distributions telles que celles que vous avez trouvées sur Windows, mais dans le cas général, ce n'est pas le cas, et la communauté des empaqueteurs s'efforce de rendre setuptools totalement facultatif.


3 Réponses :


2
votes

Pourquoi setup_requires inclut-il setuptools? Cela ne semble pas logique

Cela n'a aucun sens. D'un autre côté, cela ne gêne rien alors pourquoi pas?


5 commentaires

Merci pour les commentaires. Mais les responsables de importlib_resources sont des développeurs Python de base, il est donc peu probable qu'ils l'aient fait accidentellement. Peut-être que je ne comprends tout simplement pas comment fonctionne setup_requires . J'ai lu quelque part que setup_requires est incompatible avec pip . Est-ce vrai?


Non, pas vrai. Voir setuptools.readthedocs.io/en/latest/...


Je ne crois pas que ce soit vrai. Ce qui se passe en fait, c'est que pip évolue lentement vers une construction indépendante du système . Voir PEP 517 pour quelques informations. En gros, pépin délèguera toutes les actions de construction à setuptools, voltigent, de la poésie ou de toute autre alternative. L'interface entre pip et le système de construction sera le fichier pyproject.toml , voir PEP 518 .


@sinoroc Oui, depuis PEP 517-518 découpler pip de setuptools , vous devez maintenant spécifier l'outil de construction dans le fichier pyproject.toml. Ce que fait d'ailleurs le module importlib_resources . Mais le module spécifie également setuptools dans le fichier setup.cfg, ce qui ne semble pas logique car à ce moment-là il est trop tard.


Oui, je pense que nous sommes tous d'accord, que c'était probablement une erreur, car il ne sert à rien d'avoir setuptools dans les exigences de configuration.



4
votes

Non, setuptools ne doit pas être inclus dans setup_requires , selon PEP 518 (c'est moi qui souligne):

Setuptools a essayé de résoudre ce problème avec un argument setup_requires à sa fonction setup() [3]. Cette solution présente un certain nombre de problèmes, tels que:

  • Aucun outil (à part setuptools lui-même) ne peut accéder à ces informations sans exécuter setup.py , mais setup.py ne peut pas être exécuté sans l'installation de ces éléments.
  • Bien que setuptools lui-même installera tout ce qui est répertorié dans ce document, ils ne seront installés que pendant l'exécution de la fonction setup() , ce qui signifie que la seule façon d'utiliser réellement tout ce qui est ajouté ici est de faire des machinations de plus en plus complexes qui retardent l'importation et l'utilisation de ces modules jusqu'à plus tard dans l'exécution de la fonction setup() .
  • Cela ne peut pas inclure setuptools lui-même ni inclure un remplacement de setuptools , ce qui signifie que des projets tels que numpy.distutils sont largement incapables de l'utiliser et que les projets ne peuvent pas profiter des nouvelles fonctionnalités de setuptools jusqu'à ce que leurs utilisateurs mettent naturellement à niveau la version de setuptools vers une version plus récente. un.
  • Les éléments répertoriés dans setup_requires sont installés implicitement chaque fois que vous exécutez setup.py mais l'une des méthodes courantes d' setup.py est via un autre outil, tel que pip , qui gère déjà les dépendances. Cela signifie qu'une commande comme pip install spam peut finir par avoir à la fois pip et setuptools télécharger et installer des packages et que les utilisateurs finaux doivent configurer les deux outils (et pour setuptools sans être en contrôle de l'invocation) pour modifier les paramètres tels que le référentiel à partir duquel il installe . Cela signifie également que les utilisateurs doivent connaître les règles de découverte pour les deux outils, car l'un d'eux peut prendre en charge différents formats de package ou déterminer la dernière version différemment.

0 commentaires

4
votes

La réponse acceptée est généralement correcte, mais là où la PEP 518 le dit.

[Le mécanisme setup_requires ] ne peut pas inclure setuptools lui-même ...

C'est techniquement incorrect, et comme le démontre importlib_resources , cela peut en fait inclure setuptools . Le problème est que l'inclusion de setuptools dans setup_requires sert principalement de documentation. Il déclare que setuptools est une exigence de construction (requise pour exécuter setup.py), mais il ne sera pas capable de satisfaire cette exigence si elle n'est pas déjà satisfaite.

Mais, la présence de setuptools dans setup_requires est techniquement correcte et sert à déclarer l'exigence et à demander à setuptools de vérifier que l'exigence est bien installée (parallèlement à d'autres exigences de configuration).

Cependant, il ne s'agit que d'un artefact hérité et ne fournit pas beaucoup de valeur, et comme on peut le voir dans la question et les réponses, cela conduit à la confusion. L'approche recommandée, appropriée, est d'utiliser les déclarations et les constructeurs PEP 517 et 518, mais cette partie de l'écosystème n'a pas encore mûri, donc des vestiges de setuptools resteront. Essayez de ne pas les laisser vous déranger.


0 commentaires