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:
3 Réponses :
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?
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.
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 fonctionsetup()
[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
, maissetup.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 fonctionsetup()
.- Cela ne peut pas inclure
setuptools
lui-même ni inclure un remplacement desetuptools
, ce qui signifie que des projets tels quenumpy.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écutezsetup.py
mais l'une des méthodes courantes d'setup.py
est via un autre outil, tel quepip
, qui gère déjà les dépendances. Cela signifie qu'une commande commepip 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 poursetuptools
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.
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 incluresetuptools
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.
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êcherpip
d'installer une distribution pour la mauvaise version de Python (voir packaging.python.org/guides/… ).Cela n'a aucun sens. Ni
setup_requires
niinstall_requires
sont des mots clés standard et ne seront pas reconnus pardistutils
; ils ont une signification poursetuptools
uniquement. Un test simple:python -c "from distutils.core import setup; setup(install_requires=['foo'])" --version
crachera uneUserWarning: Unknown distribution option: 'install_requires'
. Cela signifie que sisetuptools
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.