@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.
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ß)
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.
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:
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.
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.
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.
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.
Ä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:
Entfernen install_requiresvon setup.py und verwenden nur requirements.txt mitpip
Wechseln Sie entry_pointszu scripts( doc ) und überarbeiten Sie alle Module entry_points, die vollständige Skripte mit Shebangs und einem Einstiegspunkt benötigen.
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.
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 .
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.)
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.
Antworten:
python setup.py
verwendet 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 deneasy_install
Befehl oder aufrufenpip 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.
quelle
pip
. Wie führe ich diesetup.py
Datei dann aus, wenn ich nur eine Erweiterung direkt erstellen möchte?python setup.py sdist
und installieren könnenpip install resulting_package.tar.gz
. Sie können auch verwendenpip install -e
, um direkt von der Quelle zu installieren, aber ich habe es immer vorgezogen, vom Paket oder vom Repository direkt zu installieren.pip install pendulum==1.4.4
. Durch Ausführenpip install setuptools --upgrade
wurde der Fehler behoben.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ß)
Hoffe das hilft der nächsten Person diesen Link zu finden!
quelle
pip3 install neovim-remote
.)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.
quelle
setuptools
unddistribute
Projekte 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.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 install
undsetup.py
verwenden kann, idealerweise von distutils aus. Es gibt buchstäblich keine anderen Importe oder Codes außer den kwargs zusetup()
anderen als dem, was ich hier notiere .Ich erhalte die Fehlermeldung, wenn die Importe für meine
setup.py
Datei sind:Wenn ich dies benutze, erhalte ich Warnungen wie
Wenn ich die Importe (und sonst nichts ) wie folgt ändere :
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.
quelle
import setuptools
auch auf wundersame Weise löste das Problem für mich auf Ubuntu 16.04 mit Python 3.5.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.
quelle
Fehlende Header werden installiert. Es hat mein Problem gelöst
quelle
Fazit :
distutils
nicht unterstütztinstall_requires
oderentry_points
,setuptools
tut.Änderung
from distutils.core import setup
in setup.py zufrom setuptools import setup
oder Refaktorieren setup.py zu verwenden , nurdistutils
verfügt.Ich kam hierher, weil ich nicht bemerkt hatte, dass
entry_points
es nur einsetuptools
Feature war.Wenn Sie hier sind, um mich
setuptools
zudistutils
mögen:install_requires
von setup.py und verwenden nur requirements.txt mitpip
entry_points
zuscripts
( doc ) und überarbeiten Sie alle Moduleentry_points
, die vollständige Skripte mit Shebangs und einem Einstiegspunkt benötigen.quelle
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 setuptools
in Ihremsetup.py
(wie sollten Sie die Setuptools bestimmte Optionen bei der Anwendung), dann die Tatsache , das Skript nicht versagtImportError
zeigt an, dass Setuptools richtig installiert ist .Sie können die Warnung wie folgt stumm schalten:
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.)
quelle
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.
quelle