Was bedeutet "Failed Building Wheel for X" bei der Pip-Installation?

102

Dies ist eine wirklich beliebte Frage hier bei SO, aber keine der vielen Antworten, die ich mir angesehen habe, erklärt klar, was dieser Fehler wirklich bedeutet und warum er auftritt.

Eine Quelle der Verwirrung ist, dass Sie (zum Beispiel) pip install pycparserzuerst den Fehler erhalten:

Failed building wheel for pycparser

Darauf folgt die Meldung, dass das Paket war:

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

Was geht hier vor sich?

(Ich möchte verstehen, wie etwas fehlschlagen kann, aber dennoch installiert wird und ob Sie darauf vertrauen können, dass dieses Paket ordnungsgemäß funktioniert?)

Bisher ist die beste teilweise Erklärung, die ich gefunden habe, diese .

not2qubit
quelle
7
Wenn pipfür die Anforderung kein Rad gefunden wird, lädt es die Quelldistanz herunter und versucht, lokal ein Rad daraus zu erstellen. Bei Erfolg wird das Rad pipfür zukünftige Neuinstallationen im Cache gespeichert . Wechselt bei einem Fehler beim Erstellen des Rads pipvon Source Dist (Aufruf python setup.py install) zur Legacy-Installation .
Hoefling
In Ihrem Fall fehlt Ihnen das wheelPaket, sodass Sie pipkeine Räder aus Quelldists bauen können. Wenn Sie Gebäuderäder explizit deaktivieren möchten, verwenden Sie das --no-binaryFlag : pip install somepkg --no-binary=somepkg. Oder verwenden Sie pip install somepkg --no-binary=:all:, aber beachten Sie, dass dadurch die Räder für jedes für die Installation ausgewählte Paket deaktiviert werden, einschließlich der Abhängigkeiten. Wenn für einige pipzu installierende Pakete keine Quelldistanz verfügbar ist , schlägt die Installation fehl.
hoefling
1
@hoefling: Dein erster Kommentar war der wahre Grund und könnte eine Antwort sein. Der zweite ist falsch: --no-binaryWeist pip an, nur Quelldistributionen herunterzuladen und zu verwenden. Das Flag, um zu verhindern, dass ein lokales Binärrad erstellt wird, ist in der Tat --no-cache-dir.
Serge Ballesta
@hoefling habe ich wheels(0.32.2) also das ist nicht das problem. Aber vielleicht ist dem pycparserPaket kein Rad ( *.whl) zugeordnet? Aber wie kann ich das a priori überprüfen ?
not2qubit
1
Sie können die PyPI-Site unter pypi.org/project/pycparser aufrufen und dann nach den Dateien fragen . Sie können dann sehen, dass nur eine .tar.gzDatei vorhanden ist und es sich um die Quelldistribution auf PyPI handelt (ein Rad hätte eine .whlErweiterung)
Serge Ballesta

Antworten:

81

(Pip Maintainer hier!)

Wenn das Paket kein Rad ist, versucht pip, ein Rad dafür zu bauen (via setup.py bdist_wheel). Wenn dies aus irgendeinem Grund fehlschlägt, wird die Meldung "Rad für Pycparser fehlgeschlagen" angezeigt, und pip greift direkt (via setup.py install) auf die Installation zurück .

Sobald wir ein Rad haben, kann Pip das Rad durch korrektes Auspacken installieren. pip versucht so oft wie möglich, Pakete über Räder zu installieren. Dies liegt an verschiedenen Vorteilen der Verwendung von Rädern (wie schnellere Installationen, Cache-fähig, nicht erneutes Ausführen von Code usw.).


Ihre Fehlermeldung hier ist darauf zurückzuführen, dass das wheelPaket fehlt, das die zum Einbau der Räder erforderliche Logik enthält setup.py bdist_wheel. ( pip install wheelKann das beheben.)


Das Obige ist das Legacy-Verhalten, das derzeit die Standardeinstellung ist. Wir werden irgendwann in der Zukunft standardmäßig auf PEP 517 umsteigen und uns dafür auf einen standardbasierten Prozess umstellen. Wir haben auch isolierte Builds dafür, sodass in diesen Umgebungen standardmäßig ein Rad installiert ist. :) :)

pradyunsg
quelle
1
Zum Zeitpunkt des Schreibens von OP hatte ich das wheelPaket bereits installiert. Bitte fügen Sie auch einen Link zu PEP517 hinzu.
not2qubit
Hatten Sie eine ältere Version von Setuptools oder Rad installiert? Wenn nicht, scheint dies der Grund für das Scheitern zu sein. Wie auch immer, aus Pips POV konnte das Rad nicht gebaut werden und wird daher normal installiert.
Pradyunsg
43

Gestern habe ich den gleichen Fehler bekommen: Failed building wheel for hddfancontrolals ich lief pip3 install hddfancontrol. Das Ergebnis war Failed to build hddfancontrol. Die Ursache war error: invalid command 'bdist_wheel'und Running setup.py bdist_wheel for hddfancontrol ... error. Der Fehler wurde behoben, indem Folgendes ausgeführt wurde:

 pip3 install wheel

(Von hier .)

Alternativ kann das "Rad" direkt von hier heruntergeladen werden . Nach dem Herunterladen kann es installiert werden, indem Folgendes ausgeführt wird:

pip3 install "/the/file_path/to/wheel-0.32.3-py2.py3-none-any.whl"
Matthew Wai
quelle
pip3 install wheelhat super funktioniert, auch innerhalb von 'python3 -m venv', ab heute bin ich neu bei venv
Manohar Reddy Poreddy
29

Seitdem scheint niemand dies außer mir zu erwähnen. Meine eigene Lösung für das oben genannte Problem besteht meistens darin, sicherzustellen, dass die zwischengespeicherte Kopie deaktiviert wird, indem Sie Folgendes verwenden : pip install <package> --no-cache-dir.

not2qubit
quelle
1
Wenn es Ihr Ziel ist, die Nachricht nur loszuwerden, kann dies als Korrektur gelten, andernfalls würde ich dies als Problemumgehung bezeichnen.
Nils Magnus
@NilsMagnus Dies ist nicht nur so getting rid of the message, dass die Installation auch dann fortgesetzt werden kann , wenn das Installationsprogramm der Ansicht ist, dass sie bereits aktualisiert wurde, da das Cache-Verzeichnis Rückstände von früheren und häufig fehlgeschlagenen Aktualisierungen enthält.
not2qubit
^^ Das heißt, ich frage mich immer wieder, warum dies nicht das Standardverhalten ist? Wer möchte zwischengespeicherte Kopien behalten, wenn Sie aktualisieren? Macht einfach keinen Sinn.
not2qubit
4
Wie ist das die akzeptierte Antwort auf die Frage? Es beantwortet die Frage nicht.
PascalIv
1
Weil er es selbst gefragt und auch beantwortet hat. Ich denke, auf diese Weise kann er seine eigene Antwort akzeptieren, glaube ich. Klingt komisch, aber das könnte der Fall sein.
Amit Amola
4

Es kann hilfreich sein, diese Frage aus Sicht der Paketbereitstellung zu beantworten.

Es gibt viele Tutorials, in denen erklärt wird, wie ein Paket in PyPi veröffentlicht wird. Unten sind ein paar, die ich benutzt habe;

mittlere
echte Python

Ich habe die Erfahrung gemacht, dass Sie in den meisten dieser Tutorials nur den .tar der Quelle verwenden, kein Rad. Daher habe ich bei der Installation von Paketen, die mit diesen Lernprogrammen erstellt wurden, den Fehler "Rad konnte nicht erstellt werden" erhalten.

Ich fand später auf PyPi den Link zu den PSF -Dokumenten der Python Software Foundation . Ich habe festgestellt, dass der Einrichtungs- und Erstellungsprozess etwas anders ist und tatsächlich das Erstellen einer Raddatei umfasst.

Nach Verwendung der offiziell dokumentierten Methode wurde der Fehler bei der Installation meiner Pakete nicht mehr angezeigt.

Der Fehler kann also einfach davon abhängen, wie der Entwickler das Projekt gepackt und bereitgestellt hat. Keiner von uns wurde mit dem Wissen geboren, wie man PyPi benutzt, und wenn sie auf das falsche Tutorial gestoßen sind, können Sie die Lücken ausfüllen.

Ich bin sicher, dass dies nicht der einzige Grund für den Fehler ist, aber ich bin bereit zu wetten, dass dies ein Hauptgrund dafür ist.

SteveJ
quelle
0

Versuche dies:

sudo apt-get install libpcap-dev libpq-dev

Es hat bei mir funktioniert, als ich diese beiden installiert habe.

Weitere Informationen finden Sie unter dem Link hier

tw
quelle
0

Unter Ubuntu 18.04 ist dieses Problem aufgetreten, da das aptPaket für wheelden wheelBefehl nicht enthält . Ich denke, pip versucht, das wheelPython-Paket zu importieren , und wenn dies gelingt, wird davon ausgegangen, dass der wheelBefehl auch verfügbar ist. Ubuntu bricht diese Annahme.

Das apt python3-Codepaket heißt python3-wheel. Dies wird automatisch installiert, da es python3-pipempfohlen wird.

Das apt python3 Wheel-Befehlspaket heißt python-wheel-common. Wenn Sie dies ebenfalls installieren, werden die Fehler "Fehlerhaftes Gebäuderad" für mich behoben.

JanKanis
quelle
Fehlerbericht
JanKanis
0

Ich habe die gleiche Meldung erhalten, als ich versucht habe, pip install django-imagekit zu installieren. Also habe ich Pip Install Wheel ausgeführt (ich hatte Python 2.7) und dann habe ich Pip Install Django-Imagekit erneut ausgeführt und es hat funktioniert. Vielen Dank

Marc Guvenc
quelle
-1

Dies kann Ihnen helfen! ....

Pycparser deinstallieren:

pip uninstall pycparser

Installieren Sie pycparser neu:

pip install pycparser

Ich habe den gleichen Fehler bei der Installation von termcolor erhalten und ihn durch Neuinstallation behoben.

Unfehlbare Weisheiten
quelle