Jakie jest znaczenie „Nieudane koło budowania dla X” w pip install?

125

To jest naprawdę popularne pytanie tutaj w SO, ale żadna z wielu odpowiedzi, na które patrzyłem, nie wyjaśnia jasno, co naprawdę oznacza ten błąd i dlaczego się pojawia.

Jednym ze źródeł nieporozumień jest to, że kiedy (na przykład) to robisz pip install pycparser, najpierw pojawia się błąd:

Failed building wheel for pycparser

po którym następuje komunikat, że pakiet był:

Successfully installed pycparser-2.19.


# pip3 install pycparser

Collecting pycparser
  Using cached https://files.pythonhosted.org/packages/68/9e/49196946aee219aead1290e00d1e7fdeab8567783e83e1b9ab5585e6206a/pycparser-2.19.tar.gz
Building wheels for collected packages: pycparser
  Running setup.py bdist_wheel for pycparser ... error
  Complete output from command /usr/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-g_v28hpp/pycparser/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" bdist_wheel -d /tmp/pip-wheel-__w_f6p0 --python-tag cp36:
  Traceback (most recent call last):
    File "<string>", line 1, in <module>
    ...
    File "/usr/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2349, in resolve
      module = __import__(self.module_name, fromlist=['__name__'], level=0)
  ModuleNotFoundError: No module named 'wheel.bdist_wheel'

  ----------------------------------------
  Failed building wheel for pycparser
  Running setup.py clean for pycparser
Failed to build pycparser
Installing collected packages: pycparser
  Running setup.py install for pycparser ... done
Successfully installed pycparser-2.19

Co tu się dzieje?

(Chciałbym zrozumieć, jak coś może się nie udać, ale nadal jest instalowane i czy możesz ufać, że ten pakiet działa poprawnie?)

Jak dotąd najlepszym częściowym wyjaśnieniem, jakie znalazłem, jest to .

not2qubit
źródło
8
Gdy pipnie znajdzie koła dla danego wymagania, pobiera źródło dist i próbuje zbudować z niego koło lokalnie. jeśli się powiedzie, koło zostanie zapisane w pippamięci podręcznej na potrzeby przyszłych ponownych instalacji. w przypadku niepowodzenia kompilacji koła pipprzełącza się na starszą instalację ze źródła dist (wywoływanie python setup.py install).
hoefling
W twoim przypadku brakuje wheelpakietu, więc pipnie możesz zbudować kół z plików źródłowych. jeśli chcesz jawnie niepełnosprawnymi kół budowlanych, należy użyć --no-binaryflagi: pip install somepkg --no-binary=somepkg. Lub użyj pip install somepkg --no-binary=:all:, ale uważaj, że spowoduje to wyłączenie kół dla każdego pakietu wybranego do instalacji, w tym zależności; Jeśli nie ma dostępnego źródła dist dla niektórych pakietów pipdo zainstalowania, instalacja zakończy się niepowodzeniem.
hoefling
2
@hoefling: Twój pierwszy komentarz był prawdziwym powodem i mógł być odpowiedzią. Drugi jest błędny: --no-binaryinstruuje pip, aby pobierał i używał tylko dystrybucji źródeł. Flaga uniemożliwiająca zbudowanie lokalnego koła binarnego to rzeczywiście --no-cache-dir.
Serge Ballesta
Mam @hoefling wheels(0.32.2), więc to nie jest problem. Ale może pycparserpakiet nie ma *.whlskojarzonego koła ( )? Ale jak mogę to sprawdzić a-priori ?
not2qubit
1
Możesz odwiedzić witrynę PyPI pod adresem pypi.org/project/pycparser, a następnie poprosić o pliki . Możesz wtedy zobaczyć, że .tar.gzjest tam tylko plik i jest to dystrybucja źródeł na PyPI (koło miałoby .whlrozszerzenie)
Serge Ballesta

Odpowiedzi:

106

(opiekun pip tutaj!)

Jeśli pakiet nie jest kołem, pip próbuje zbudować dla niego koło (przez setup.py bdist_wheel). Jeśli to się nie powiedzie z jakiegokolwiek powodu, pojawi się komunikat „Failed building wheel for pycparser” i pip wraca do instalacji bezpośredniej (via setup.py install).

Gdy już mamy koło, pip może je zamontować po prawidłowym rozpakowaniu. pip próbuje instalować pakiety za pomocą kół tak często, jak to możliwe. Dzieje się tak z powodu różnych zalet używania kół (takich jak szybsze instalacje, możliwość buforowania, brak ponownego wykonywania kodu itp.).


Twój komunikat o błędzie jest spowodowany wheelbrakiem pakietu, który zawiera logikę wymaganą do wbudowania kół setup.py bdist_wheel. ( pip install wheelmoże to naprawić.)


Powyższe jest starszym zachowaniem, które jest obecnie domyślne; W przyszłości przejdziemy na PEP 517 domyślnie, przechodząc do procesu opartego na standardach. Mamy również izolowane kompilacje do tego, więc domyślnie miałbyś zainstalowane koło w tych środowiskach. :)

pradyunsg
źródło
1
W momencie pisania OP miałem już wheelzainstalowany pakiet. Dodaj również link do PEP517.
not2qubit
Czy masz zainstalowaną starszą wersję setuptools lub wheel? Jeśli nie, wydaje się, że jest to przyczyna niepowodzenia. W każdym razie z punktu widzenia pipa nie udało się zbudować koła i dlatego instaluje się normalnie.
pradyunsg
Czy jest sposób, aby pominąć generowanie koła ( setup.py bdist_wheel) i po prostu wykonać instalację ( setup.py install)?
K3 --- rnc
54

Wczoraj dostałem ten sam błąd: Failed building wheel for hddfancontrolkiedy biegałem pip3 install hddfancontrol. Wynik był Failed to build hddfancontrol. Przyczyną był error: invalid command 'bdist_wheel'i Running setup.py bdist_wheel for hddfancontrol ... error. Błąd został naprawiony, uruchamiając następujące polecenie:

 pip3 install wheel

( Stąd .)

Alternatywnie „koło” można pobrać bezpośrednio z tego miejsca . Po pobraniu można go zainstalować, uruchamiając następujące polecenie:

pip3 install "/the/file_path/to/wheel-0.32.3-py2.py3-none-any.whl"
Matthew Wai
źródło
pip3 install wheeldziałało świetnie, nawet w środku 'python3 -m venv', od dziś jestem nowy w venv
Manohar Reddy Poreddy
2
nawet po zamontowaniu koła nie działa u mnie!
Vatalay
35

Ponieważ nikt nie wspomina o tym poza mną. Moje własne rozwiązanie powyższego problemu jest najczęściej, aby upewnić się, aby wyłączyć pamięci podręcznej kopii za pomocą: pip install <package> --no-cache-dir.

not2qubit
źródło
2
Jeśli Twoim celem jest po prostu pozbycie się wiadomości, może to potraktować jako rozwiązanie, w przeciwnym razie nazwałbym to obejściem.
Nils Magnus
@NilsMagnus Jest to nie tylko getting rid of the message, że jest umożliwienie procesu instalacji nawet gdy instalator myśli, że został już zaktualizowany, dzięki katalogu pamięci podręcznej zawierającej pozostałości z poprzednich, często nieudanych aktualizacji.
not2qubit
^^ To powiedziawszy, ciągle się zastanawiam, dlaczego nie jest to zachowanie domyślne? Kto chce przechowywać kopie w pamięci podręcznej podczas aktualizacji? Po prostu nie ma sensu.
not2qubit
5
Jaka jest akceptowana odpowiedź na pytanie? Nie odpowiada na pytanie.
PascalIv
1
Ponieważ on sam o to zapytał i również odpowiedział. Myślę, że w ten sposób może zaakceptować własną odpowiedź. Brzmi dziwnie, ale tak może być.
Amit Amola
4

Warto odpowiedzieć na to pytanie z perspektywy wdrażania pakietu.

Istnieje wiele samouczków, które wyjaśniają, jak opublikować pakiet w PyPi. Poniżej znajduje się kilka, z których korzystałem;

średni
prawdziwy Python

Z mojego doświadczenia wynika, że ​​w większości tych samouczków używasz tylko pliku .tar źródła, a nie koła. Dlatego podczas instalowania pakietów utworzonych przy użyciu tych samouczków otrzymałem błąd „Nie udało się zbudować koła”.

Później znalazłem link na PyPi do dokumentacji Python Software Foundation PSF Docs . Odkryłem, że ich proces konfiguracji i kompilacji jest nieco inny i rzeczywiście obejmuje tworzenie pliku koła.

Po użyciu oficjalnie udokumentowanej metody nie otrzymałem już błędu podczas instalowania moich pakietów.

Tak więc błąd może być po prostu kwestią tego, jak programista spakował i wdrożył projekt. Nikt z nas nie urodził się, wiedząc, jak używać PyPi, a jeśli trafił na niewłaściwy samouczek - cóż, możesz wypełnić puste miejsca.

Jestem pewien, że to nie jedyny powód błędu, ale założę się, że jest to główny powód.

SteveJ
źródło
2

Spróbuj tego:

sudo apt-get install libpcap-dev libpq-dev

U mnie zadziałało, gdy zainstalowałem te dwa.

Zobacz łącze tutaj, aby uzyskać więcej informacji

tw
źródło
1

Błąd:

System: instancja aws ec2 (mała t2)

problem: podczas instalowania opencv python za pośrednictwem

pip3 install opencv-python

  Problem with the CMake installation, aborting build. CMake executable is cmake
  
  ----------------------------------------
  Failed building wheel for opencv-python
  Running setup.py clean for opencv-python

Co mi pomogło

pip3 install --upgrade pip setuptools wheel

Po tym nadal możesz otrzymać poniższy błąd

    from .cv2 import *
ImportError: libGL.so.1: cannot open shared object file: No such file or directory

Zainstalowanie libgl rozwiązało problem za mnie.

sudo apt update
sudo apt install libgl1-mesa-glx

Mam nadzieję że to pomoże

Hemant c
źródło
1
pip3 install --upgrade pip setuptools wheelrozwiązałem to też dla mnie
wotter
0

W systemie Ubuntu 18.04 napotkałem ten problem, ponieważ aptpakiet dla wheelnie zawiera wheelpolecenia. Myślę, że pip próbuje zaimportować wheelpakiet Pythona, a jeśli to się powiedzie, zakłada, że wheelpolecenie jest również dostępne. Ubuntu łamie to założenie.

Nazwa pakietu kodu apt python3 python3-wheel. Jest to instalowane automatycznie, ponieważ python3-pipzaleca to.

Pakiet poleceń apt python3 wheel ma nazwę python-wheel-common. Zainstalowanie tego również rozwiązuje za mnie błędy „nieudanego koła budowania”.

JanKanis
źródło
0

Otrzymałem ten sam komunikat, gdy próbowałem zainstalować pip install django-imagekit. Uruchomiłem więc koło instalacyjne pip (miałem Pythona 2.7), a następnie ponownie zainstalowałem pip install django-imagekit i zadziałało. Dzięki

Marc Guvenc
źródło
0

Chciałbym dodać, że jeśli masz tylko Python3 w swoim systemie, musisz zacząć używać pip3 zamiast pip.

Możesz zainstalować pip3 za pomocą następującego polecenia;

sudo apt install python3-pip -y

Następnie możesz spróbować zainstalować pakiet, którego potrzebujesz;

sudo pip3 install <package>
Maarten
źródło
0

Miałem ten sam problem podczas instalacji Brotli

BŁĄD

Failed building wheel for Brotli

Rozwiązałem to, pobierając .whlplik stąd i instalując go za pomocą poniższego polecenia

C:\Users\{user_name}\Downloads>pip install Brotli-1.0.9-cp39-cp39-win_amd64.whl
Teko_boy
źródło
0

W moim przypadku zaktualizuj wersję pip po utworzeniu venv, ta aktualizacja pip z 9.0.1 na 20.3.1

python3 -m venv env/python
source env/python/bin/activate
pip3 install pip --upgrade

Ale wiadomość była ...

Using legacy 'setup.py install' for django-avatar, since package 'wheel' is not installed.

Następnie instaluję pakiet kół po aktualizacji pip

python3 -m venv env/python
source env/python/bin/activate
pip3 install --upgrade pip
pip3 install wheel

A wiadomość była ...

Building wheel for django-avatar (setup.py): started
default:   Building wheel for django-avatar (setup.py): finished with status 'done'
Jantones
źródło
-3

To może ci pomóc! ....

Odinstalowywanie pycparser:

pip uninstall pycparser

Zainstaluj ponownie pycparser:

pip install pycparser

Wystąpił ten sam błąd podczas instalacji termcolor i naprawiłem go, instalując ponownie.

Nieomylne mądrości
źródło