pypi UserWarning: Nieznana opcja dystrybucji: „install_requires”


112

Czy ktoś napotyka to ostrzeżenie podczas wykonywania python setup.py installpakietu PyPI?

install_requiresokreśla, czego wymaga pakiet. Wiele pakietów PyPI ma tę opcję. Jak to może być „nieznana opcja dystrybucji”?


1
Możliwy duplikat
dodania

@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.


3
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ę)

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

Mam nadzieję, że pomoże to następnej osobie znaleźć ten link!


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.


1
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

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

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.

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.


1
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.


32
setuptools jest zainstalowany. nadal ma ostrzeżenie.
Tyler Long

Masz rację, ten błąd pojawia się w Pythonie 2.6.6, nawet jeśli zainstalowano setuptools lub dystrybucję. Jeśli spróbuję z 2.7.2, to jednak nie ma.
Fredrik Håård

4
Mam ten problem w Pythonie 2.7.3
Calvin Cheng

2
Zrobiło to dla mnie: wget bootstrap.pypa.io/ez_setup.py -O - ​​| sudo python
radtek

Dziękuję @radtek, że dla mnie też zadziałało. Może mógłbyś zamienić swój komentarz w odpowiedź?
Esteis

4
sudo apt-get install python-dev  # for python2.x installs
sudo apt-get install python3-dev  # for python3.x installs

Zainstaluje brakujące nagłówki. To rozwiązało mój problem


4

Podsumowując :

distutilsnie obsługuje install_requireslub entry_points, setuptoolstak.

Zmiany from distutils.core import setupw setup.py do from setuptools import setuplub Refactor swojej setup.py używać tylko distutilsfunkcji.

Przyjechałem tutaj, ponieważ nie zdawałem sobie sprawy, że entry_pointsto tylko setuptoolsfunkcja.

Jeśli jesteś tutaj i chcesz przekonwertować się setuptoolsdo distutilsmnie:

  1. usunąć install_requiresz setup.py i po prostu użyć requirements.txt zpip
  2. zmień entry_pointsna scripts( doc ) i zrefaktoryzuj wszystkie moduły entry_pointswymagające pełnych skryptów z shebangami i punktem wejścia.

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?
chrisinmtown

2

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 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.

Możesz wyciszyć ostrzeżenie w następujący sposób:

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

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)


0

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.