@tripleee może, ale to pytanie zostało zadane wcześniej niż tamto.
Tyler Long
Wiek pytań to kwestia drugorzędna, ale i tak nie mam zdecydowanej opinii. Jeśli chcesz, aby zduplikowana nominacja przebiegła w drugą stronę, może utwórz pytanie Meta Stack Overflow, aby zwiększyć widoczność. Dla mnie osobiście zaakceptowana odpowiedź na drugie pytanie pomogła mi bardziej, ponieważ jest bardziej bezpośrednia i ukierunkowana. Wydaje się, że nigdy nie zaakceptowałeś żadnej z tych odpowiedzi, więc jest to czynnik, który możesz zmienić.
tripleee
1
@tripleee jeśli uważnie przeczytasz ten wątek, zorientujesz się, że nie ma idealnej odpowiedzi. Więc nie wiem, którą odpowiedź przyjąć. Nie chcę wprowadzać ludzi w błąd, wybierając odpowiedź, która nie może nawet przekonać samego siebie.
Tyler Long
Odpowiedzi:
89
python setup.pyużywa distutils, które nie obsługują install_requires. setuptools robi, także dystrybuuje (jego następca) i pip (który używa jednego z nich) do. Ale tak naprawdę musisz ich użyć. To znaczy wywołaj setuptools za pomocą easy_installpolecenia lub pip install.
Innym sposobem jest zaimportowanie instalacji z setuptools do twojego setup.py, ale to nie jest standardowe i sprawia, że każdy, kto chce używać twojego pakietu, musi mieć zainstalowane setuptools.
Powiedzmy, że chcę użyć pip, a jak uruchomić setup.pyplik, jeśli chcę tylko zbudować rozszerzenie na miejscu?
Fred Foo
11
Ostrzeżenie nie zapobiega spakowaniu kodu, więc możesz go uruchomić python setup.py sdisti zainstalować z pip install resulting_package.tar.gz. Możesz także użyć pip install -edo instalacji bezpośrednio ze źródła, ale zawsze wolałem instalować z pakietu lub bezpośrednio z repozytorium.
Sebastian Blask
To jest trochę pokręcone. Zawsze możesz najpierw spróbować zaimportować konfigurację z setuptools, w przeciwnym razie skorzystaj z distutils i otrzymaj ostrzeżenie. Jeśli jednak jest w pypy, możesz skończyć z „Zbyt wiele otwartych plików”, ponieważ setuptools nie zamykają poprawnie deskryptorów (nawet w Debianie, z domyślnym ulimit -n 1024): bugs.pypy.org/issue878
fiorix
1
Zobacz moją odpowiedź - o ile wiem, jest to zwykły błąd w setuptools. Użytkownik nie robi nic złego, tak jest setuptools.
ncoghlan,
To pośrednio odpowiada na moje pytanie: mam błąd w wyniku biegania pip install pendulum==1.4.4. Uruchomienie pip install setuptools --upgradeusunęło błąd.
Wyrzuć konto
32
To był pierwszy wynik w mojej wyszukiwarce Google, ale nie miał odpowiedzi. Zauważyłem, że uaktualnienie setuptools rozwiązało problem za mnie (i pip na dobrą miarę)
To również rozwiązało problem. (Python 3.4, próbuje pip3 install neovim-remote.)
Michael Iles
To zadziałało dla mnie. Próbowałem zainstalować mako w Pythonie 2.7.16. Masz podobną opcję nieznanej dystrybucji. Pip był OK, ale setuptools przeszedł do 41.0.1 z 40.6.2. Następnie Mako zainstalował A-OK.
Max Yaffe
18
UWAGA ! UWAGA ! Niedoskonała odpowiedź przed nami. Aby uzyskać „najnowszą notatkę” na temat stanu opakowań we wszechświecie Pythona, przeczytaj ten dość szczegółowy esej .
Właśnie napotkałem ten problem podczas próby zbudowania / zainstalowania ansibla. Wydaje się, że problem polega na tym, że distutils naprawdę nie obsługują install_requires. Setuptools powinny małpować dystrybucje w locie, ale tak się nie dzieje, prawdopodobnie dlatego, że ostatnia wersja setuptools to 0.6c11 z 2009 roku, podczas gdy distutils jest podstawowym projektem Pythona.
Więc nawet po ręcznej instalacji setuptools-0.6c11-py2.7.egg, uruchomione setup.py pobiera tylko distutils dist.py, a nie ten z site-packages / setuptools /.
Również dokumentacja setuptools zawiera wskazówki dotyczące używania ez_setup, a nie distutils.
Jednak samo narzędzie setuptools jest obecnie dostarczane przez dystrybucję , a ten wariant setup () obsługuje install_requires.
Negocjowane, ponieważ ta odpowiedź zawiera dezinformację i zamieszanie co do tego, czym są różne rzeczy. Na przykład ez_setup.py jest instalatorem bootstrapowym dla setuptools i nie jest czymś, czego można by użyć „zamiast” distutils. Większość pakietów PyPI nie jest „po prostu błędnych”.
Iguananaut
1
@Iguananaut, dziękujemy za przejrzenie odpowiedzi; Edytowałem to.
PAStheLoD
O super, dzięki. W takim przypadku ponownie zagłosuję za :) Esej Nicka Coghlana, do którego dołączyłeś, to ten, którym podzieliłem się wcześniej z moimi współpracownikami, aby spróbować nakłonić ich do owinięcia głowy wokół tych rzeczy.
Iguananaut
Świetny esej o stanie rzeczy w marcu 2013 r. Jedno pytanie… Autor stwierdza: „ Projekty setuptoolsi distributesą w trakcie ponownego scalania, ale połączenie nie jest jeszcze zakończone (zaktualizuję ten esej, gdy tylko to się zmienia) ”. Czy ktoś wie, jaki jest dotychczasowy stan rzeczy na 2019 rok? Ponieważ data końca życia Pythona 2.7 szybko się zbliża, wiele pakietów Pythona będzie w trakcie aktualizacji i ponownego pakowania.
TrinitronX
16
Jestem na komputerze Mac z Pythonem 2.7.11. Bawiłem się tworzeniem niezwykle prostych i nieskomplikowanych projektów, których jedynym wymaganiem jest to, że potrafię uruchomić python setup.py installi setup.pyużywać polecenia setup, najlepiej z distutils. Nie ma dosłownie żadnych innych importów ani kodów poza kwargami do setup()innych niż to, co tutaj odnotowałem.
Pojawia się błąd, gdy importy mojego setup.pypliku to:
from distutils.core import setup
Kiedy tego używam, otrzymuję ostrzeżenia, takie jak
Jeśli zmienię import (i nic więcej ) na następujące:
from distutils.core import setup
import setuptools # noqa
Ostrzeżenia znikają.
Zauważ, że nie używam setuptools, po prostu importowanie zmienia zachowanie tak, że nie emituje już ostrzeżeń. Dla mnie to jest przyczyną naprawdę zaskakującej różnicy, w której niektóre projekty, których używam, dają takie ostrzeżenia, a inne nie.
Najwyraźniej zachodzi jakaś forma małpiego łatania i wpływa na nią to, czy import jest wykonywany, czy nie. Prawdopodobnie nie jest to sytuacja dla wszystkich badających ten problem, ale dla wąskiego środowiska, w którym pracuję, jest to odpowiedź, której szukałem.
Jest to zgodne z innym komentarzem (społeczności), który mówi, że distutils powinny monkeypatch setuptools i że mieli problem podczas instalowania Ansible. Wygląda na to, że Ansible próbował zezwolić na instalacje bez korzystania z narzędzi konfiguracyjnych w przeszłości, a następnie wrócił do tego.
Wiele rzeczy unosi się w powietrzu ... ale jeśli szukasz prostej odpowiedzi na prosty projekt, prawdopodobnie powinieneś po prostu zaimportować narzędzia konfiguracyjne.
Dodanie import setuptoolsrównież w cudowny sposób rozwiązało problem na Ubuntu 16.04 z Pythonem 3.5.
kuropan
8
To jest ostrzeżenie od distutils i oznacza, że nie masz zainstalowanych narzędzi setuptools. Zainstalowanie go z http://pypi.python.org/pypi/setuptools usunie ostrzeżenie.
Próbuję zrozumieć, jaki jest zalecany pakiet. Piszesz "używaj tylko funkcji distutils" również "konwertuj narzędzia setuptools na distutils", ale także stwierdzenie, że "punkty_wejścia były tylko funkcją setuptools", wydaje się nieco sprzeczne?
Jeśli masz bezwarunkowe import setuptoolsw swoją setup.py(jak powinien, jeśli za pomocą setuptools konkretnych opcjach), to fakt, że skrypt nie zawodzi z ImportErrorwskazuje, że setuptools jest prawidłowo zainstalowana.
Tylko to zrobić, jeśli używasz bezwarunkowe importu, które będą całkowicie powiedzie się, jeśli nie jest zainstalowane setuptools :)
(Widzę to samo zachowanie w kasie z repozytorium setuptools po fuzji, dlatego jestem przekonany, że jest to błąd setuptools, a nie problem z konfiguracją systemu. Spodziewam się, że dystrybucja przed scaleniem miałaby ten sam problem)
Widziałem to teraz w starszych narzędziach używających Python2.7, gdzie kompilacja (jak plik Dockerfile) instaluje odpiętą zależność, na przykład pytest. PyTest porzucił obsługę Pythona 2.7, więc może być konieczne określenie wersji <nowej wersji pakietu.
Lub ugryź się w kulę i przekonwertuj tę aplikację na Python 3, jeśli jest to wykonalne.
Odpowiedzi:
python setup.py
używa distutils, które nie obsługują install_requires. setuptools robi, także dystrybuuje (jego następca) i pip (który używa jednego z nich) do. Ale tak naprawdę musisz ich użyć. To znaczy wywołaj setuptools za pomocąeasy_install
polecenia lubpip install
.Innym sposobem jest zaimportowanie instalacji z setuptools do twojego setup.py, ale to nie jest standardowe i sprawia, że każdy, kto chce używać twojego pakietu, musi mieć zainstalowane setuptools.
źródło
pip
, a jak uruchomićsetup.py
plik, jeśli chcę tylko zbudować rozszerzenie na miejscu?python setup.py sdist
i zainstalować zpip install resulting_package.tar.gz
. Możesz także użyćpip install -e
do instalacji bezpośrednio ze źródła, ale zawsze wolałem instalować z pakietu lub bezpośrednio z repozytorium.pip install pendulum==1.4.4
. Uruchomieniepip install setuptools --upgrade
usunęło błąd.To był pierwszy wynik w mojej wyszukiwarce Google, ale nie miał odpowiedzi. Zauważyłem, że uaktualnienie setuptools rozwiązało problem za mnie (i pip na dobrą miarę)
Mam nadzieję, że pomoże to następnej osobie znaleźć ten link!
źródło
pip3 install neovim-remote
.)UWAGA ! UWAGA ! Niedoskonała odpowiedź przed nami. Aby uzyskać „najnowszą notatkę” na temat stanu opakowań we wszechświecie Pythona, przeczytaj ten dość szczegółowy esej .
Właśnie napotkałem ten problem podczas próby zbudowania / zainstalowania ansibla. Wydaje się, że problem polega na tym, że distutils naprawdę nie obsługują install_requires. Setuptools powinny małpować dystrybucje w locie, ale tak się nie dzieje, prawdopodobnie dlatego, że ostatnia wersja setuptools to 0.6c11 z 2009 roku, podczas gdy distutils jest podstawowym projektem Pythona.
Więc nawet po ręcznej instalacji setuptools-0.6c11-py2.7.egg, uruchomione setup.py pobiera tylko distutils dist.py, a nie ten z site-packages / setuptools /.
Również dokumentacja setuptools zawiera wskazówki dotyczące używania ez_setup, a nie distutils.
Jednak samo narzędzie setuptools jest obecnie dostarczane przez dystrybucję , a ten wariant setup () obsługuje install_requires.
źródło
setuptools
idistribute
są w trakcie ponownego scalania, ale połączenie nie jest jeszcze zakończone (zaktualizuję ten esej, gdy tylko to się zmienia) ”. Czy ktoś wie, jaki jest dotychczasowy stan rzeczy na 2019 rok? Ponieważ data końca życia Pythona 2.7 szybko się zbliża, wiele pakietów Pythona będzie w trakcie aktualizacji i ponownego pakowania.Jestem na komputerze Mac z Pythonem 2.7.11. Bawiłem się tworzeniem niezwykle prostych i nieskomplikowanych projektów, których jedynym wymaganiem jest to, że potrafię uruchomić
python setup.py install
isetup.py
używać polecenia setup, najlepiej z distutils. Nie ma dosłownie żadnych innych importów ani kodów poza kwargami dosetup()
innych niż to, co tutaj odnotowałem.Pojawia się błąd, gdy importy mojego
setup.py
pliku to:Kiedy tego używam, otrzymuję ostrzeżenia, takie jak
Jeśli zmienię import (i nic więcej ) na następujące:
Ostrzeżenia znikają.
Zauważ, że nie używam
setuptools
, po prostu importowanie zmienia zachowanie tak, że nie emituje już ostrzeżeń. Dla mnie to jest przyczyną naprawdę zaskakującej różnicy, w której niektóre projekty, których używam, dają takie ostrzeżenia, a inne nie.Najwyraźniej zachodzi jakaś forma małpiego łatania i wpływa na nią to, czy import jest wykonywany, czy nie. Prawdopodobnie nie jest to sytuacja dla wszystkich badających ten problem, ale dla wąskiego środowiska, w którym pracuję, jest to odpowiedź, której szukałem.
Jest to zgodne z innym komentarzem (społeczności), który mówi, że distutils powinny monkeypatch setuptools i że mieli problem podczas instalowania Ansible. Wygląda na to, że Ansible próbował zezwolić na instalacje bez korzystania z narzędzi konfiguracyjnych w przeszłości, a następnie wrócił do tego.
https://github.com/ansible/ansible/blob/devel/setup.py
Wiele rzeczy unosi się w powietrzu ... ale jeśli szukasz prostej odpowiedzi na prosty projekt, prawdopodobnie powinieneś po prostu zaimportować narzędzia konfiguracyjne.
źródło
import setuptools
również w cudowny sposób rozwiązało problem na Ubuntu 16.04 z Pythonem 3.5.To jest ostrzeżenie od distutils i oznacza, że nie masz zainstalowanych narzędzi setuptools. Zainstalowanie go z http://pypi.python.org/pypi/setuptools usunie ostrzeżenie.
źródło
Zainstaluje brakujące nagłówki. To rozwiązało mój problem
źródło
Podsumowując :
distutils
nie obsługujeinstall_requires
lubentry_points
,setuptools
tak.Zmiany
from distutils.core import setup
w setup.py dofrom setuptools import setup
lub Refactor swojej setup.py używać tylkodistutils
funkcji.Przyjechałem tutaj, ponieważ nie zdawałem sobie sprawy, że
entry_points
to tylkosetuptools
funkcja.Jeśli jesteś tutaj i chcesz przekonwertować się
setuptools
dodistutils
mnie:install_requires
z setup.py i po prostu użyć requirements.txt zpip
entry_points
nascripts
( doc ) i zrefaktoryzuj wszystkie modułyentry_points
wymagające pełnych skryptów z shebangami i punktem wejścia.źródło
O ile wiem, jest to błąd w setuptools, który nie usuwa opcji specyficznych dla setuptools przed wywołaniem klasy bazowej w bibliotece standardowej: https://bitbucket.org/pypa/setuptools/issue/29 / unikaj-userwarnings-emitted-when-call
Jeśli masz bezwarunkowe
import setuptools
w swojąsetup.py
(jak powinien, jeśli za pomocą setuptools konkretnych opcjach), to fakt, że skrypt nie zawodzi zImportError
wskazuje, że setuptools jest prawidłowo zainstalowana.Możesz wyciszyć ostrzeżenie w następujący sposób:
Tylko to zrobić, jeśli używasz bezwarunkowe importu, które będą całkowicie powiedzie się, jeśli nie jest zainstalowane setuptools :)
(Widzę to samo zachowanie w kasie z repozytorium setuptools po fuzji, dlatego jestem przekonany, że jest to błąd setuptools, a nie problem z konfiguracją systemu. Spodziewam się, że dystrybucja przed scaleniem miałaby ten sam problem)
źródło
Widziałem to teraz w starszych narzędziach używających Python2.7, gdzie kompilacja (jak plik Dockerfile) instaluje odpiętą zależność, na przykład pytest. PyTest porzucił obsługę Pythona 2.7, więc może być konieczne określenie wersji <nowej wersji pakietu.
Lub ugryź się w kulę i przekonwertuj tę aplikację na Python 3, jeśli jest to wykonalne.
źródło