pypi UserWarning: Unbekannte Verteilungsoption: 'install_requires'

112

Tritt bei der Ausführung python setup.py installeines PyPI-Pakets jemand auf diese Warnung auf ?

install_requiresdefiniert, was das Paket benötigt. Viele PyPI-Pakete haben diese Option. Wie kann es eine "unbekannte Verteilungsoption" sein?

Tyler Long
quelle
@tripleee vielleicht, aber diese Frage wurde früher als diese gestellt.
Tyler Long
Das Fragealter ist ein zweitrangiges Anliegen, aber ich habe in keiner Weise eine starke Meinung. Wenn Sie möchten, dass die doppelte Nominierung umgekehrt verläuft, erstellen Sie möglicherweise eine Frage zum Meta-Stapelüberlauf , um die Sichtbarkeit zu gewährleisten. Für mich persönlich hat mir die akzeptierte Antwort der anderen Frage mehr geholfen, weil sie direkter und zielgerichteter ist. Sie scheinen keine dieser Antworten jemals akzeptiert zu haben, das ist also ein Faktor, den Sie tatsächlich ändern könnten.
Tripleee
1
@tripleee Wenn Sie diesen Thread sorgfältig lesen, werden Sie feststellen, dass es überhaupt keine perfekte Antwort gibt. Ich weiß also nicht, welche Antwort ich akzeptieren soll. Ich möchte die Menschen nicht irreführen, indem ich eine Antwort auswähle, die mich nicht einmal überzeugen kann.
Tyler Long

Antworten:

89

python setup.pyverwendet distutils, die install_requires nicht unterstützen. setuptools vertreibt auch (seinen Nachfolger) und pip (der beides verwendet). Aber du musst sie tatsächlich benutzen. Dh setuptools über den easy_installBefehl oder aufrufen pip install.

Eine andere Möglichkeit besteht darin, das Setup von setuptools in Ihre setup.py zu importieren. Dies ist jedoch kein Standard und führt dazu, dass jeder, der Ihr Paket verwenden möchte, setuptools installiert haben muss.

Sebastian Blask
quelle
3
Angenommen, ich möchte verwenden pip. Wie führe ich die setup.pyDatei dann aus, wenn ich nur eine Erweiterung direkt erstellen möchte?
Fred Foo
11
Die Warnung hindert Sie nicht daran, Ihren Code zu verpacken, sodass Sie ihn ausführen python setup.py sdistund installieren können pip install resulting_package.tar.gz. Sie können auch verwenden pip install -e, um direkt von der Quelle zu installieren, aber ich habe es immer vorgezogen, vom Paket oder vom Repository direkt zu installieren.
Sebastian Blask
Das ist ein bisschen durcheinander. Sie können immer zuerst versuchen, das Setup von setuptools zu importieren, andernfalls gehen Sie zu distutils und erhalten die Warnung. Wenn es sich jedoch um eine Pypy-Datei handelt, werden möglicherweise "Zu viele offene Dateien" angezeigt, da Setuptools die Deskriptoren nicht ordnungsgemäß schließen (selbst unter Debian mit dem Standard-Ulimit -n von 1024): bugs.pypy.org/issue878
fiorix
1
Siehe meine Antwort - soweit ich das beurteilen kann, ist dies nur ein direkter Fehler in Setuptools. Der Benutzer macht nichts falsch, setuptools ist.
Ncoghlan
Dies beantwortet indirekt meine Frage: Ich habe den Fehler als Ergebnis des Laufens erhalten pip install pendulum==1.4.4. Durch Ausführen pip install setuptools --upgradewurde der Fehler behoben.
Wegwerfen Konto
32

Dies war das erste Ergebnis meiner Google-Suche, hatte aber keine Antwort. Ich fand, dass das Upgrade von setuptools das Problem für mich löste (und pip für ein gutes Maß)

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

Hoffe das hilft der nächsten Person diesen Link zu finden!

Matt
quelle
Dies löste es auch für mich. (Python 3.4 versucht es pip3 install neovim-remote.)
Michael Iles
Das hat bei mir funktioniert. Ich habe versucht, mako auf Python 2.7.16 zu installieren. Ich habe eine ähnliche Option für die unbekannte Verteilung erhalten. Pip war in Ordnung, aber setuptools ging von 40.6.2 auf 41.0.1. Dann installierte Mako A-OK.
Max Yaffe
18

ACHTUNG ! ACHTUNG ! Unvollkommene Antwort voraus. Lesen Sie diesen ziemlich detaillierten Aufsatz, um das "neueste Memo" zum Zustand der Verpackung im Python-Universum zu erhalten .

Ich bin gerade auf dieses Problem gestoßen, als ich versucht habe, ansible zu erstellen / zu installieren. Das Problem scheint zu sein, dass distutils install_requires wirklich nicht unterstützt . Setuptools sollten Distutils im laufenden Betrieb mit Affen patchen, dies ist jedoch nicht der Fall, wahrscheinlich weil die letzte Version von Setuptools ab 2009 0.6c11 ist, während Distutils ein Kernprojekt von Python ist.

Selbst nach der manuellen Installation von setuptools-0.6c11-py2.7.egg nimmt setup.py nur distutils dist.py auf und nicht das von site-packages / setuptools /.

Außerdem enthält die Dokumentation zu setuptools Hinweise zur Verwendung von ez_setup und nicht von distutils.

Setuptools wird heutzutage jedoch selbst von Distribute bereitgestellt , und diese Variante von setup () unterstützt install_requires.

PAStheLoD
quelle
1
Abgestimmt, da diese Antwort einige Desinformationen und Verwirrung darüber enthält, was verschiedene Dinge sind. ez_setup.py ist beispielsweise ein Bootstrap-Installationsprogramm für setuptools und wird nicht "anstelle von" distutils verwendet. Die meisten PyPI-Pakete sind nicht "einfach falsch".
Iguananaut
1
@Iguananaut, danke für die Überprüfung der Antwort; Ich habe es bearbeitet.
PAStheLoD
Oh cool, danke. In diesem Fall werde ich erneut abstimmen :) Nick Coghlans Aufsatz, mit dem Sie verlinkt haben, habe ich zuvor mit meinen Kollegen geteilt, um sie dazu zu bringen, ihre Köpfe um dieses Zeug zu wickeln.
Iguananaut
Großartiger Aufsatz über den Stand der Dinge im März 2013. Eine Frage ... Der Autor stellt fest: "Die setuptoolsund distributeProjekte werden gerade wieder zusammengeführt, aber die Fusion ist noch nicht abgeschlossen (ich werde diesen Aufsatz so bald wie möglich aktualisieren das ändert sich). " Weiß jemand, wie der Stand der Dinge bis 2019 ist? Da sich das End of Life-Datum von Python 2.7 schnell nähert, werden viele Python-Pakete aktualisiert und neu verpackt.
TrinitronX
16

Ich bin auf einem Mac mit Python 2.7.11. Ich habe damit gespielt, extrem einfache und unkomplizierte Projekte zu erstellen, bei denen meine einzige Anforderung darin besteht, dass ich den Setup-Befehl ausführen python setup.py installund setup.pyverwenden kann, idealerweise von distutils aus. Es gibt buchstäblich keine anderen Importe oder Codes außer den kwargs zu setup()anderen als dem, was ich hier notiere .

Ich erhalte die Fehlermeldung, wenn die Importe für meine setup.pyDatei sind:

from distutils.core import setup

Wenn ich dies benutze, erhalte ich Warnungen wie

/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py:267: UserWarning: Unbekannte Verteilungsoption: 'entry_points' warnings.warn ( Nachricht)

Wenn ich die Importe (und sonst nichts ) wie folgt ändere :

from distutils.core import setup
import setuptools  # noqa

Die Warnungen verschwinden.

Beachten Sie, dass ich nicht verwende setuptools. Durch einfaches Importieren wird das Verhalten so geändert, dass keine Warnungen mehr ausgegeben werden. Für mich ist dies die Ursache für einen wirklich verblüffenden Unterschied, bei dem einige Projekte, die ich verwende, diese Warnungen geben, andere nicht.

Es ist klar, dass irgendeine Form von Affen-Patching stattfindet, und es hängt davon ab, ob dieser Import durchgeführt wird oder nicht. Dies ist wahrscheinlich nicht die Situation für alle, die dieses Problem untersuchen, aber für die enge Umgebung, in der ich arbeite, ist dies die Antwort, nach der ich gesucht habe.


Dies steht im Einklang mit dem anderen (Community-) Kommentar, der besagt, dass Distutils Setuptools monkeypatchen sollten und dass sie das Problem bei der Installation von Ansible hatten. Ansible scheint versucht zu haben, Installationen zuzulassen, ohne in der Vergangenheit Setuptools zu haben, und ging dann darauf zurück.

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

Es liegt viel in der Luft ... aber wenn Sie nach einer einfachen Antwort für ein einfaches Projekt suchen, sollten Sie wahrscheinlich nur Setuptools importieren.

AlanSE
quelle
1
Das Hinzufügen von import setuptoolsauch auf wundersame Weise löste das Problem für mich auf Ubuntu 16.04 mit Python 3.5.
Kuropan
8

Dies ist eine Warnung von distutils und ein Zeichen dafür, dass Sie keine Setuptools installiert haben. Durch die Installation von http://pypi.python.org/pypi/setuptools wird die Warnung entfernt.

Fredrik Håård
quelle
32
setuptools ist installiert. hat noch die Warnung.
Tyler Long
Sie haben völlig Recht, ich erhalte diesen Fehler in Python 2.6.6, auch wenn setuptools oder Distribute installiert ist. Wenn ich es mit 2.7.2 versuche, ist es aber weg.
Fredrik Håård
4
Ich habe dieses Problem in Python 2.7.3
Calvin Cheng
2
Das hat es für mich getan: wget bootstrap.pypa.io/ez_setup.py -O - ​​| Sudo Python
Radtek
Danke, @radtek, das hat auch bei mir funktioniert. Vielleicht könnten Sie Ihren Kommentar zu einer Antwort machen?
Esteis
4
sudo apt-get install python-dev  # for python2.x installs
sudo apt-get install python3-dev  # for python3.x installs

Fehlende Header werden installiert. Es hat mein Problem gelöst

Priyanshu Chauhan
quelle
4

Fazit :

distutilsnicht unterstützt install_requiresoder entry_points, setuptoolstut.

Änderung from distutils.core import setupin setup.py zu from setuptools import setupoder Refaktorieren setup.py zu verwenden , nur distutilsverfügt.

Ich kam hierher, weil ich nicht bemerkt hatte, dass entry_pointses nur ein setuptoolsFeature war.

Wenn Sie hier sind, um mich setuptoolszu distutilsmögen:

  1. Entfernen install_requiresvon setup.py und verwenden nur requirements.txt mitpip
  2. Wechseln Sie entry_pointszu scripts( doc ) und überarbeiten Sie alle Module entry_points, die vollständige Skripte mit Shebangs und einem Einstiegspunkt benötigen.
Karsten
quelle
Ich versuche zu verstehen, was das empfohlene Paket ist. Sie schreiben "Nur Distutils-Features verwenden" und "Setuptools in Distutils konvertieren", geben aber auch an, dass "entry_points nur ein Setuptools-Feature war", was etwas widersprüchlich erscheint.
Chrisinmtown
2

Soweit ich das beurteilen kann, handelt es sich um einen Fehler in setuptools, bei dem die setuptools-spezifischen Optionen nicht entfernt werden, bevor die Basisklasse in der Standardbibliothek aufgerufen wird: https://bitbucket.org/pypa/setuptools/issue/29 / Vermeiden Sie Benutzerwarnungen, die beim Aufruf ausgegeben werden

Wenn Sie einen unbedingten haben import setuptoolsin Ihrem setup.py(wie sollten Sie die Setuptools bestimmte Optionen bei der Anwendung), dann die Tatsache , das Skript nicht versagt ImportErrorzeigt an, dass Setuptools richtig installiert ist .

Sie können die Warnung wie folgt stumm schalten:

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

Nur dies tut , wenn Sie den bedingungslosen Import verwenden , die völlig fehl , wenn Setuptools nicht installiert ist :)

(Ich sehe dasselbe Verhalten beim Auschecken aus dem Setuptools-Repo nach dem Zusammenschluss, weshalb ich zuversichtlich bin, dass es sich eher um einen Setuptools-Fehler als um ein Systemkonfigurationsproblem handelt. Ich gehe davon aus, dass die Verteilung vor dem Zusammenführen das gleiche Problem haben würde.)

ncoghlan
quelle
0

Ich habe dies jetzt in älteren Tools mit Python2.7 gesehen, in denen ein Build (wie eine Docker-Datei) eine nicht fixierte Abhängigkeit installiert, z. B. pytest. PyTest hat die Python 2.7-Unterstützung eingestellt, daher müssen Sie möglicherweise die Version <der neuen Paketversion angeben.

Oder beißen Sie in die Kugel und konvertieren Sie diese App in Python 3, wenn dies möglich ist.

Danny Staple
quelle