pypi UserWarning: Option de distribution inconnue: 'install_requires'

112

Quelqu'un rencontre-t-il cet avertissement lors de l'exécution python setup.py installd'un package PyPI?

install_requiresdéfinit ce dont le package a besoin. De nombreux packages PyPI ont cette option. Comment cela peut-il être une "option de distribution inconnue"?

Tyler Long
la source
1
Double
tripleee
@tripleee peut-être, mais cette question a été posée plus tôt que celle-là.
Tyler Long
L'âge des questions est une préoccupation secondaire, mais je n'ai pas d'opinion tranchée de toute façon. Si vous souhaitez que la nomination en double aille dans l'autre sens, créez peut-être une question Meta Stack Overflow pour plus de visibilité. Pour moi personnellement, la réponse acceptée de l'autre question m'a aidé davantage, car elle est plus directe et ciblée. Vous ne semblez jamais avoir accepté aucune de ces réponses, c'est donc un facteur que vous pourriez réellement changer.
tripleee
1
@tripleee si vous lisez attentivement ce fil, vous vous rendrez compte qu'il n'y a pas du tout de réponse parfaite. Donc je ne sais pas quelle réponse accepter. Je ne veux pas induire les gens en erreur en choisissant une réponse qui ne peut même pas me convaincre.
Tyler Long

Réponses:

89

python setup.pyutilise distutils qui ne prend pas en charge install_requires. setuptools le fait, distribue également (son successeur) et pip (qui utilise l'un ou l'autre) le font. Mais vous devez en fait les utiliser. C'est-à-dire appeler setuptools via la easy_installcommande ou pip install.

Une autre façon est d'importer la configuration de setuptools dans votre setup.py, mais ce n'est pas standard et oblige tous ceux qui souhaitent utiliser votre package à installer setuptools.

Sebastian Blask
la source
3
Dites que je veux utiliser pip, comment puis-je exécuter le setup.pyfichier si je souhaite uniquement créer une extension sur place?
Fred Foo
11
L'avertissement ne vous empêche pas d'empaqueter votre code, vous pouvez donc l'exécuter python setup.py sdistet l'installer avec pip install resulting_package.tar.gz. Vous pouvez également utiliser pip install -epour installer directement à partir des sources, mais j'ai toujours préféré installer à partir du package ou du référentiel directement ..
Sebastian Blask
C'est un peu foiré. Vous pouvez toujours essayer d'importer la configuration de setuptools en premier, sinon allez avec distutils et obtenez l'avertissement. Si c'est dans pypy, cependant, vous pourriez vous retrouver avec "Trop de fichiers ouverts" car setuptools ne ferme pas correctement les descripteurs (même sur Debian, avec la valeur par défaut ulimit -n de 1024): bugs.pypy.org/issue878
fiorix
1
Voir ma réponse - pour autant que je sache, ce n'est qu'un simple bogue dans setuptools. L'utilisateur ne fait rien de mal, setuptools le fait.
ncoghlan
Cela répond indirectement à ma question: j'ai eu l'erreur à la suite de l'exécution pip install pendulum==1.4.4. L'exécution a pip install setuptools --upgradeeffacé l'erreur.
Compte à jeter
32

C'était le premier résultat de ma recherche Google, mais il n'y avait pas de réponse. J'ai trouvé que la mise à niveau de setuptools a résolu le problème pour moi (et pip pour faire bonne mesure)

pip install --upgrade pip
pip install --upgrade setuptools

J'espère que cela aidera la prochaine personne à trouver ce lien!

Mat
la source
Cela l'a résolu pour moi aussi. (Python 3.4, essayant de pip3 install neovim-remote.)
Michael Iles
Cela a fonctionné pour moi. J'essayais d'installer mako sur Python 2.7.16. Vous avez une option de distribution inconnue similaire. Pip était OK mais setuptools est passé à 41.0.1 à partir de 40.6.2. Ensuite, Mako a installé A-OK.
Max Yaffe
18

ATTENTION ! ATTENTION ! Réponse imparfaite à venir. Pour obtenir le "dernier mémo" sur l'état du packaging dans l'univers Python, lisez cet essai assez détaillé .

Je viens de rencontrer ce problème en essayant de construire / installer ansible. Le problème semble être que distutils ne prend vraiment pas en charge install_requires. Setuptools devrait monkey-patch distutils à la volée, mais ce n'est pas le cas, probablement parce que la dernière version de setuptools est la 0.6c11 de 2009, alors que distutils est un projet Python principal.

Ainsi, même après avoir installé manuellement setuptools-0.6c11-py2.7.egg, l'exécution de setup.py ne récupère que distutils dist.py, et non celui de site-packages / setuptools /.

La documentation de setuptools indique également l'utilisation de ez_setup et non de distutils.

Cependant, setuptools est lui-même fourni par distribuer de nos jours, et cette saveur de setup () prend en charge install_requires.

PAStheLoD
la source
1
Voté contre, car cette réponse contient une certaine désinformation et une certaine confusion quant à ce que sont les différentes choses. ez_setup.py, par exemple, est un programme d'installation d'amorçage pour setuptools et n'est pas quelque chose que l'on utiliserait "au lieu de" distutils. La plupart des packages PyPI ne sont pas "simplement faux".
Iguananaut
1
@Iguananaut, merci d'avoir relu la réponse; Je l'ai édité.
PAStheLoD
Oh cool, merci. Je vais re-voter dans ce cas :) L'essai de Nick Coghlan que vous avez lié est celui que j'ai partagé avec mes collègues avant d'essayer de les amener à comprendre ce truc.
Iguananaut
Grand essai sur l'état des choses en mars 2013. Une question ... L'auteur déclare: "Les projets setuptoolset distributesont en train de fusionner, mais la fusion n'est pas encore terminée (je mettrai à jour cet essai dès que qui change). " Est-ce que quelqu'un sait quel est l'état des choses en 2019? Avec la date de fin de vie de Python 2.7 approchant rapidement, de nombreux packages Python seront en cours de mise à jour et de reconditionnement.
TrinitronX
16

Je suis sur un Mac avec python 2.7.11. J'ai joué avec la création de projets extrêmement simples et directs, où ma seule exigence est que je puisse exécuter python setup.py installet setup.pyutiliser la commande setup, idéalement à partir de distutils. Il n'y a littéralement aucune autre importation ou code en dehors des kwargs à setup()part ce que je note ici.

J'obtiens l'erreur lorsque les importations de mon setup.pyfichier sont:

from distutils.core import setup

Lorsque j'utilise ceci, je reçois des avertissements tels que

/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py:267: UserWarning: Option de distribution inconnue: 'entry_points' warnings.warn ( msg)

Si je change les importations (et rien d'autre ) comme suit:

from distutils.core import setup
import setuptools  # noqa

Les avertissements disparaissent.

Notez que je n'utilise pas setuptools, il suffit de l' importer pour changer le comportement de sorte qu'il n'émette plus les avertissements. Pour moi, c'est la cause d'une différence vraiment déconcertante où certains projets que j'utilise donnent ces avertissements, et d'autres pas.

De toute évidence, une certaine forme de patching de singe est en cours, et elle dépend du fait que l'importation soit effectuée ou non. Ce n'est probablement pas la situation pour tous ceux qui recherchent ce problème, mais pour l'environnement restreint dans lequel je travaille, c'est la réponse que je cherchais.


Ceci est cohérent avec l'autre commentaire (de la communauté), qui dit que les distutils devraient monkeypatch setuptools, et qu'ils ont eu le problème lors de l'installation d'Ansible. Ansible semble avoir essayé d'autoriser les installations sans avoir installé setuptools dans le passé, puis y est revenu.

https://github.com/ansible/ansible/blob/devel/setup.py

Il y a beaucoup de choses en suspens ... mais si vous cherchez une réponse simple pour un projet simple, vous devriez probablement importer simplement setuptools.

AlanSE
la source
1
L'ajout a import setuptoolségalement résolu miraculeusement le problème pour moi sur ubuntu 16.04 avec python 3.5.
kuropan
8

Ceci est un avertissement de distutils, et c'est un signe que vous n'avez pas installé setuptools. L'installer à partir de http://pypi.python.org/pypi/setuptools supprimera l'avertissement.

Fredrik Håård
la source
32
setuptools est installé. a toujours l'avertissement.
Tyler Long
Vous avez tout à fait raison, j'obtiens cette erreur dans Python 2.6.6 même si setuptools ou distribuer est installé. Si j'essaye avec 2.7.2, c'est parti.
Fredrik Håård
4
J'ai ce problème en python 2.7.3
Calvin Cheng
2
Cela l'a fait pour moi: wget bootstrap.pypa.io/ez_setup.py -O - ​​| sudo python
radtek
Merci, @radtek, cela a fonctionné pour moi aussi. Peut-être pourriez-vous faire de votre commentaire une réponse?
Esteis
4
sudo apt-get install python-dev  # for python2.x installs
sudo apt-get install python3-dev  # for python3.x installs

Il installera tous les en-têtes manquants. Cela a résolu mon problème

Priyanshu Chauhan
la source
4

En conclusion :

distutilsne prend pas en charge install_requiresou entry_points, setuptoolsfait.

changement from distutils.core import setupdans setup.py à from setuptools import setupou refactor votre setup.py d'utiliser uniquement distutilsfonctionnalités.

Je suis venu ici parce que je n'avais pas réalisé entry_pointsque ce n'était qu'une setuptoolsfonctionnalité.

Si vous souhaitez vous convertir setuptoolspour distutilsm'aimer:

  1. supprimer install_requiresde setup.py et utiliser simplement requirements.txt avecpip
  2. changer entry_pointsen scripts( doc ) et refactoriser tous les modules en s'appuyant sur entry_pointsdes scripts complets avec des shebangs et un point d'entrée.
Karsten
la source
J'essaie de comprendre quel est le package recommandé. Vous écrivez "n'utiliser que les fonctionnalités distutils" aussi "convertir setuptools en distutils", mais aussi déclarer "entry_points n'était qu'une fonctionnalité setuptools", semble un peu contradictoire?
chrisinmtown
2

Pour autant que je sache, il s'agit d'un bogue dans setuptools où il ne supprime pas les options spécifiques de setuptools avant d'appeler la classe de base dans la bibliothèque standard: https://bitbucket.org/pypa/setuptools/issue/29 / éviter-userwarnings-emitted-when-call

Si vous avez un inconditionnel import setuptoolsdans votre setup.py(comme vous devriez le faire si vous utilisez les options spécifiques de setuptools), le fait que le script ImportErrorn'échoue pas indique que setuptools est correctement installé.

Vous pouvez désactiver l'avertissement comme suit:

python -W ignore::UserWarning:distutils.dist setup.py <any-other-args>

Ne faites cela que si vous utilisez l'importation inconditionnelle qui échouera complètement si setuptools n'est pas installé :)

(Je vois ce même comportement lors d'une vérification du repo post-fusion setuptools, c'est pourquoi je suis convaincu qu'il s'agit d'un bogue setuptools plutôt que d'un problème de configuration système. Je m'attends à ce que la distribution avant la fusion ait le même problème)

ncoghlan
la source
0

J'ai maintenant vu cela dans les outils hérités utilisant Python2.7, où une construction (comme un Dockerfile) installe une dépendance non épinglée, par exemple pytest. PyTest a abandonné la prise en charge de Python 2.7, vous devrez donc peut-être spécifier la version <la nouvelle version du package.

Ou mordez la balle et convertissez cette application en Python 3 si cela est viable.

Danny Agrafe
la source