Qual è il significato di "Costruzione ruota non riuscita per X" nell'installazione di pip?


114

Questa è una domanda davvero popolare qui a SO, ma nessuna delle molte risposte che ho esaminato spiega chiaramente cosa significhi veramente questo errore e perché si verifica.

Una fonte di confusione è che quando (ad esempio) lo fai pip install pycparser, ricevi per la prima volta l'errore:

Failed building wheel for pycparser

che è poi seguito dal messaggio che il pacchetto era:

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

Che cosa sta succedendo qui?

(Vorrei capire come qualcosa può fallire ma viene comunque installato e se puoi fidarti che questo pacchetto funzioni correttamente?)

Finora la migliore spiegazione parziale che ho trovato è questa .


8
Quando pipnon trova una ruota per il requisito, scarica la dist sorgente e cerca di costruirla localmente. in caso di successo, la ruota viene memorizzata nella pipcache di per future reinstallazioni. in caso di errore di compilazione della ruota, pippassa all'installazione legacy dalla dist sorgente (invocando python setup.py install).
Hoefling

Nel tuo caso, ti manca il wheelpacchetto, quindi pipnon è possibile creare ruote da sorgenti dists. se vuoi disabilitare esplicitamente la costruzione di ruote, usa il --no-binaryflag:pip install somepkg --no-binary=somepkg . Oppure usa pip install somepkg --no-binary=:all:, ma fai attenzione che questo disabiliterà le ruote per ogni pacchetto selezionato per l'installazione, comprese le dipendenze; se non è disponibile alcuna dist sorgente per pipl'installazione di alcuni pacchetti , l'installazione fallirà.
Hoefling

2
@hoefling: il tuo primo commento è stato il vero motivo e potrebbe essere una risposta. Il secondo è sbagliato: --no-binaryindica a pip di scaricare e utilizzare solo le distribuzioni sorgente. La bandiera per impedirgli di costruire una ruota binaria locale è infatti --no-cache-dir.
Serge Ballesta

@hoefling ho wheels(0.32.2) quindi non è questo il problema. Ma forse il pycparserpacchetto non ha una ruota ( *.whl) associata? Ma come posso verificarlo a priori ?
not2qubit

1
Puoi consultare il sito PyPI su pypi.org/project/pycparser e poi chiedere i file . Puoi quindi vedere che c'è solo un .tar.gzfile ed è la distribuzione dei sorgenti su PyPI (una ruota avrebbe .whlun'estensione)
Serge Ballesta

Risposte:


94

(pip manutentore qui!)

Se il pacchetto non è una ruota, pip cerca di costruirne una (tramite setup.py bdist_wheel ). Se ciò fallisce per qualsiasi motivo, viene visualizzato il messaggio "Failed building wheel for pycparser" e pip torna all'installazione direttamente (tramite setup.py install).

Una volta che abbiamo una ruota, pip può installarla disimballandola correttamente. pip cerca di installare i pacchetti tramite le ruote il più spesso possibile. Ciò è dovuto ai vari vantaggi dell'utilizzo delle ruote (come installazioni più veloci, possibilità di cache, non eseguire nuovamente il codice, ecc.).


Il tuo messaggio di errore qui è dovuto alla wheelmancanza del pacchetto, che contiene la logica richiesta per costruire le ruote setup.py bdist_wheel. ( pip install wheelpuò aggiustarlo.)


Quanto sopra è il comportamento legacy attualmente predefinito; passeremo a PEP 517 per impostazione predefinita, in futuro, spostandoci a un processo basato su standard per questo. Abbiamo anche build isolate per questo, quindi avresti la ruota installata in quegli ambienti per impostazione predefinita. :)


1
Al momento della stesura di OP, avevo già wheelinstallato il pacchetto. Inoltre, aggiungi un collegamento a PEP517.
not2qubit

Hai installato una versione precedente di setuptools o wheel? In caso contrario, questo sembra essere il motivo del fallimento. Comunque, dal punto di vista di pip, non è riuscito a costruire la ruota e quindi si installa normalmente.
pradyunsg

C'è un modo per saltare la generazione della ruota ( setup.py bdist_wheel) e fare semplicemente l'installazione ( setup.py install)?
K3 --- rnc

49

Ieri ho ricevuto lo stesso errore: Failed building wheel for hddfancontrolquando ho corso pip3 install hddfancontrol. Il risultato è stato Failed to build hddfancontrol. La causa era error: invalid command 'bdist_wheel'e Running setup.py bdist_wheel for hddfancontrol ... error. L'errore è stato risolto eseguendo quanto segue:

 pip3 install wheel

(Da qui .)

In alternativa, la "ruota" può essere scaricata direttamente da qui . Una volta scaricato, può essere installato eseguendo quanto segue:

pip3 install "/the/file_path/to/wheel-0.32.3-py2.py3-none-any.whl"

pip3 install wheelha funzionato alla grande, anche all'interno di 'python3 -m venv', ad oggi sono nuovo di venv
Manohar Reddy Poreddy

1
anche dopo aver installato la ruota non funziona per me!
vatsalay

33

Da allora, nessuno sembra parlarne a parte me stesso. La mia soluzione al problema di cui sopra è più spesso per assicurarsi di disattivare la cache di copia utilizzando: pip install <package> --no-cache-dir.


1
Se il tuo obiettivo è semplicemente eliminare il messaggio, questo può contare come una soluzione, altrimenti lo definirei una soluzione alternativa.
Nils Magnus

@NilsMagnus Questo non è solo getting rid of the message, consente all'installazione di procedere anche quando l'installatore pensa che sia già stato aggiornato, a causa della directory della cache contenente residui di aggiornamenti precedenti e spesso falliti.
not2qubit

^^ Detto questo, continuo a chiedermi perché questo non è il comportamento predefinito? Chi desidera mantenere le copie cache durante l'aggiornamento? Semplicemente non ha alcun senso.
not2qubit

4
Come è questa la risposta accettata alla domanda? Non risponde alla domanda.
PascalIv

1
Perché lui stesso l'ha chiesto e ha risposto anche lui. Penso che in questo modo possa accettare la sua risposta, credo. Sembra strano ma potrebbe essere così.
Amit Amola

4

Potrebbe essere utile affrontare questa domanda dal punto di vista della distribuzione dei pacchetti.

Ci sono molti tutorial là fuori che spiegano come pubblicare un pacchetto su PyPi. Di seguito sono riportati un paio che ho usato;

vero pitone medio

La mia esperienza è che la maggior parte di questi tutorial ti consente di utilizzare solo il .tar della sorgente, non una ruota. Pertanto, durante l'installazione di pacchetti creati utilizzando questi tutorial, ho ricevuto l'errore "Impossibile costruire la ruota".

Successivamente ho trovato il collegamento su PyPi ai documenti PSF Docs della Python Software Foundation . Ho scoperto che il loro processo di configurazione e costruzione è leggermente diverso e in effetti includeva la creazione di un file wheel.

Dopo aver utilizzato il metodo ufficialmente documentato, non ho più ricevuto l'errore durante l'installazione dei miei pacchetti.

Quindi, l'errore potrebbe essere semplicemente una questione di come lo sviluppatore ha confezionato e distribuito il progetto. Nessuno di noi è nato sapendo come usare PyPi e se si è imbattuto nel tutorial sbagliato, beh, puoi riempire gli spazi vuoti.

Sono sicuro che non sia l'unica ragione dell'errore, ma sono disposto a scommettere che è una delle ragioni principali.


2

Prova questo:

sudo apt-get install libpcap-dev libpq-dev

Ha funzionato per me quando ho installato questi due.

Vedere il collegamento qui per ulteriori informazioni


0

Su Ubuntu 18.04, ho riscontrato questo problema perché il aptpacchetto per wheelnon include il wheelcomando. Penso che pip cerchi di importare il wheelpacchetto python e, se riesce, si presume che anche il wheelcomando sia disponibile. Ubuntu infrange questa ipotesi.

Il pacchetto di codice apt python3 è denominato python3-wheel. Questo viene installato automaticamente perché lo python3-pipconsiglia.

Viene chiamato il pacchetto di comandi apt python3 wheel python-wheel-common. L'installazione anche di questo risolve gli errori di "ruota di costruzione guasta" per me.



0

Ho ricevuto lo stesso messaggio quando ho provato a installare pip install django-imagekit. Quindi ho eseguito pip install wheel (avevo python 2.7) e poi ho rieseguito pip install django-imagekit e ha funzionato. Grazie


0

Vorrei aggiungere che se hai solo Python3 sul tuo sistema, devi iniziare a usare pip3 invece di pip.

Puoi installare pip3 usando il seguente comando;

sudo apt install python3-pip -y

Dopodiché puoi provare ad installare il pacchetto che ti serve;

sudo pip3 install <package>

0

Errore:

Sistema: istanza aws ec2 (t2 small)

problema: durante l'installazione di opencv python tramite

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

Cosa ha funzionato per me

pip3 install --upgrade pip setuptools wheel

Dopo questo potresti ancora ricevere un errore di errore

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

L'installazione di libgl ha risolto l'errore per me.

sudo apt update
sudo apt install libgl1-mesa-glx

Spero che sia di aiuto


0

Ho avuto lo stesso problema durante l'installazione di Brotli

ERRORE

Failed building wheel for Brotli

L'ho risolto scaricando il .whlfile da qui e installandolo utilizzando il comando seguente

C:\Users\{user_name}\Downloads>pip install Brotli-1.0.9-cp39-cp39-win_amd64.whl

-2

Questo potrebbe aiutarti! ....

Disinstallazione di pycparser:

pip uninstall pycparser

Reinstallare pycparser:

pip install pycparser

Ho ricevuto lo stesso errore durante l'installazione di termcolor e l'ho risolto reinstallandolo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.