¿Cuál es el significado de "rueda de construcción fallida para X" en la instalación de pip?

114

Esta es una pregunta realmente popular aquí en SO, pero ninguna de las muchas respuestas que he analizado explica claramente qué significa realmente este error y por qué ocurre.

Una fuente de confusión es que cuando (por ejemplo) lo hace pip install pycparser, primero recibe el error:

Failed building wheel for pycparser

que luego es seguido por el mensaje de que el paquete 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

¿Que esta pasando aqui?

(Me gustaría entender cómo algo puede fallar pero aún así instalarse y si puede confiar en que este paquete funciona correctamente)

Hasta ahora, la mejor explicación parcial que he encontrado es la siguiente .

not2qubit
fuente
8
Cuando pipno encuentra una rueda para el requisito, descarga la fuente dist e intenta construir una rueda localmente. si tiene éxito, la rueda se almacena en pipla memoria caché para futuras reinstalaciones. si falla la construcción de la rueda, pipcambia a la instalación heredada desde la fuente dist (invocando python setup.py install).
hoefling
En su caso, le falta el wheelpaquete, por piplo que no puede construir ruedas a partir de discos de origen. si quieres desactivar ruedas construcción explícita, utilice la --no-binarybandera: pip install somepkg --no-binary=somepkg. O use pip install somepkg --no-binary=:all:, pero tenga en cuenta que esto desactivará las ruedas para cada paquete seleccionado para la instalación, incluidas las dependencias; si no hay una distribución de origen disponible para algún paquete que pipdeba instalarse, la instalación fallará.
hoefling
2
@hoefling: tu primer comentario fue la verdadera razón y podría ser una respuesta. El segundo es incorrecto: --no-binaryindica a pip que solo descargue y use distribuciones de código fuente. La bandera para evitar que se construya una rueda binaria local sí lo es --no-cache-dir.
Serge Ballesta
@hoefling tengo wheels(0.32.2) así que ese no es el problema. ¿Pero tal vez el pycparserpaquete no tiene una rueda ( *.whl) asociada? Pero, ¿cómo puedo comprobar esto a priori ?
not2qubit
1
Puede consultar el sitio de PyPI en pypi.org/project/pycparser y luego solicitar los archivos . Luego puede ver que solo hay un .tar.gzarchivo allí y es la distribución de origen en PyPI (una rueda tendría una .whlextensión)
Serge Ballesta

Respuestas:

94

(¡mantenedor de pip aquí!)

Si el paquete no es una rueda, pip intenta construir una rueda para él (vía setup.py bdist_wheel). Si eso falla por alguna razón, aparece el mensaje "Falló la rueda de construcción para pycparser" y pip vuelve a instalar directamente (vía setup.py install).

Una vez que tenemos una rueda, pip puede instalar la rueda desempaquetando correctamente. pip intenta instalar paquetes a través de ruedas tan a menudo como puede. Esto se debe a varias ventajas del uso de ruedas (como instalaciones más rápidas, almacenamiento en caché, no ejecutar código de nuevo, etc.).


Su mensaje de error aquí se debe a wheelque falta el paquete, que contiene la lógica necesaria para construir las ruedas setup.py bdist_wheel. ( pip install wheelpuede arreglar eso).


Lo anterior es el comportamiento heredado que actualmente es el predeterminado; cambiaremos a PEP 517 de forma predeterminada, en algún momento en el futuro, para pasar a un proceso basado en estándares para esto. También tenemos compilaciones aisladas para eso, por lo que tendría la rueda instalada en esos entornos de forma predeterminada. :)

pradyunsg
fuente
1
En el momento de escribir OP, ya tenía el wheelpaquete instalado. También agregue un enlace a PEP517.
not2qubit
¿Tenía instalada una versión anterior de setuptools o wheel? Si no, esa parece ser la razón del fracaso allí. De todos modos, desde el punto de vista de pip, no pudo construir la rueda y, por lo tanto, se instala normalmente.
pradyunsg
¿Hay alguna manera de omitir la generación de ruedas ( setup.py bdist_wheel) y simplemente hacer la instalación ( setup.py install)?
K3 --- rnc
49

Ayer, recibí el mismo error: Failed building wheel for hddfancontrolcuando ejecuté pip3 install hddfancontrol. El resultado fue Failed to build hddfancontrol. La causa fue error: invalid command 'bdist_wheel'y Running setup.py bdist_wheel for hddfancontrol ... error. El error se solucionó ejecutando lo siguiente:

 pip3 install wheel

(Desde aquí .)

Alternativamente, la "rueda" se puede descargar directamente desde aquí . Cuando se descarga, se puede instalar ejecutando lo siguiente:

pip3 install "/the/file_path/to/wheel-0.32.3-py2.py3-none-any.whl"
Matthew Wai
fuente
pip3 install wheelfuncionó muy bien, incluso dentro de 'python3 -m venv', a partir de hoy soy nuevo en venv
Manohar Reddy Poreddy
1
¡Incluso después de instalar la rueda, no me funciona!
vatsalay
33

Desde entonces, nadie parece mencionar esto aparte de mí. Mi propia solución al problema anterior es lo más a menudo para asegurarse de desactivar la caché copia utilizando: pip install <package> --no-cache-dir.

not2qubit
fuente
1
Si su objetivo es simplemente deshacerse del mensaje, esto puede contar como una solución, de lo contrario, lo llamaría una solución alternativa.
Nils Magnus
@NilsMagnus Esto no es solo getting rid of the message, está permitiendo que la instalación continúe incluso cuando el instalador piensa que ya se ha actualizado, debido a que el directorio de caché contiene residuos de actualizaciones anteriores y, a menudo, fallidas.
not2qubit
^^ Dicho esto, sigo preguntándome por qué este no es el comportamiento predeterminado. ¿Quién quiere mantener copias en caché cuando está actualizando? Simplemente no tiene ningún sentido.
not2qubit
4
¿Cómo es esa la respuesta aceptada a la pregunta? No responde a la pregunta.
PascalIv
1
Porque él mismo lo preguntó y también respondió. Creo que de esta manera él puede aceptar su propia respuesta, creo. Suena extraño, pero ese podría ser el caso.
Amit Amola
4

Puede resultar útil abordar esta cuestión desde la perspectiva de la implementación de paquetes.

Hay muchos tutoriales que explican cómo publicar un paquete en PyPi. A continuación se muestran un par que he usado;

pitón real mediana

Mi experiencia es que la mayoría de estos tutoriales solo hacen que use el .tar de la fuente, no una rueda. Por lo tanto, al instalar paquetes creados con estos tutoriales, recibí el error "No se pudo construir la rueda".

Más tarde encontré el enlace en PyPi a los documentos PSF Docs de la Python Software Foundation . Descubrí que su proceso de configuración y construcción es ligeramente diferente y, de hecho, incluye la construcción de un archivo de rueda.

Después de usar el método documentado oficialmente, ya no recibí el error al instalar mis paquetes.

Por lo tanto, el error podría ser simplemente una cuestión de cómo el desarrollador empaquetó e implementó el proyecto. Ninguno de nosotros nació sabiendo cómo usar PyPi, y si se encontraron con el tutorial equivocado, bueno, puede completar los espacios en blanco.

Estoy seguro de que esa no es la única razón del error, pero estoy dispuesto a apostar que es una de las principales razones.

SteveJ
fuente
2

Prueba esto:

sudo apt-get install libpcap-dev libpq-dev

Me ha funcionado cuando instalé estos dos.

Consulte el enlace aquí para obtener más información.

tw
fuente
0

En Ubuntu 18.04, encontré este problema porque el aptpaquete wheelno incluye el wheelcomando. Creo que pip intenta importar el wheelpaquete de Python y, si tiene éxito, se asume que el wheelcomando también está disponible. Ubuntu rompe esa suposición.

El paquete de código apt python3 se llama python3-wheel. Esto se instala automáticamente porque lo python3-piprecomienda.

El paquete de comandos de rueda de apt python3 se llama python-wheel-common. La instalación de esto también corrige los errores de "rueda de construcción fallida" para mí.

JanKanis
fuente
informe de error
JanKanis
0

Recibí el mismo mensaje cuando intenté instalar pip install django-imagekit. Así que ejecuté pip install wheel (tenía python 2.7) y luego volví a ejecutar pip install django-imagekit y funcionó. Gracias

Marc Guvenc
fuente
0

Me gustaría agregar que si solo tiene Python3 en su sistema, entonces debe comenzar a usar pip3 en lugar de pip.

Puede instalar pip3 usando el siguiente comando;

sudo apt install python3-pip -y

Después de esto, puede intentar instalar el paquete que necesita con;

sudo pip3 install <package>
Maarten
fuente
0

Error:

Sistema: instancia de aws ec2 (t2 pequeña)

problema: al instalar opencv python a través de

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

Que funciono para mi

pip3 install --upgrade pip setuptools wheel

Después de esto, es posible que reciba un error de error siguiente

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

La instalación de libgl resolvió el error por mí.

sudo apt update
sudo apt install libgl1-mesa-glx

Espero que esto ayude

Hemant c
fuente
0

Tuve el mismo problema al instalar Brotli

ERROR

Failed building wheel for Brotli

Lo resolví descargando el .whlarchivo desde aquí e instalándolo usando el siguiente comando

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

¡Esto puede ayudarte! ....

Desinstalar pycparser:

pip uninstall pycparser

Reinstale pycparser:

pip install pycparser

Recibí el mismo error al instalar termcolor y lo solucioné volviéndolo a instalar.

Sabidurías infalibles
fuente