Що означає "Невдале будівельне колесо для X" у піп-інсталяції?


113

Це справді популярне питання тут, у SO, але жодна з багатьох відповідей, які я розглядав, чітко не пояснює, що ця помилка насправді означає і чому вона виникає.

Одним із джерел плутанини є те, що коли (наприклад) ви це робите pip install pycparser, ви спочатку отримуєте помилку:

Failed building wheel for pycparser

після чого йде повідомлення про те, що пакет був:

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

Що тут відбувається?

(Я хотів би зрозуміти, як щось може вийти з ладу, але все одно встановитись і чи можна довіряти цьому пакету правильно функціонувати?)

Наразі найкраще часткове пояснення, яке я знайшов, це таке .


8
Коли pipне знаходить колеса для вимоги, він завантажує дистрибутив джерела та намагається побудувати колесо з нього локально. після успіху колесо зберігається в pipкеш-пам’яті для подальшої переустановки. при відмові збірки коліс pipпереходить на застарілу інсталяцію з джерела dist (виклик python setup.py install).
hoefling

У вашому випадку вам не вистачає wheelпакету, тому ви pipне можете будувати колеса з вихідних дисків. якщо ви хочете , щоб в явному вигляді відключити будівельні колеса, використовуйте --no-binaryпрапор: pip install somepkg --no-binary=somepkg. Або використовуйте pip install somepkg --no-binary=:all:, але пам’ятайте, що це вимкне колеса для кожного пакета, вибраного для установки, включаючи залежності; якщо для встановлення деяких пакунків не існує вихідного дистрибутива pip, установка не вдасться.
hoefling

2
@hoefling: ваш перший коментар був справжньою причиною і міг бути відповіддю. Другий неправильний: --no-binaryінструктує pip завантажувати та використовувати лише вихідні дистрибутиви. Прапор, який заважає йому створювати локальне двійкове колесо, справді є --no-cache-dir.
Serge Ballesta

@hoefling у мене є wheels(0.32.2), так що це не проблема. Але, можливо, pycparserпакунок не має колеса ( *.whl)? Але як я можу перевірити це a-priori ?
not2qubit

1
Ви можете звернутися до сайту PyPI за адресою pypi.org/project/pycparser, а потім попросити файли . Тоді ви можете побачити, що .tar.gzтам є лише файл, і це вихідний розподіл на PyPI (колесо мало б .whlрозширення)
Серж Баллеста

Відповіді:


93

(піп-супровідник тут!)

Якщо пакет не є колесом, pip намагається побудувати для нього колесо (через setup.py bdist_wheel). Якщо це не вдається з будь-якої причини, ви отримуєте повідомлення "Не вдалося побудувати колесо для pycparser", і піп повертається до безпосередньої установки (через setup.py install).

Отримавши колесо, піп може встановити колесо, правильно розпакувавши його. pip намагається встановлювати пакети через колеса якомога частіше. Це пов’язано з різними перевагами використання коліщаток (наприклад, швидша установка, кешування, не виконання коду знову).


Ваше повідомлення про помилку тут пов’язано з wheelвідсутністю пакету, який містить логіку, необхідну для вбудовування коліс setup.py bdist_wheel. (це pip install wheelможна виправити.)


Вище наведено застарілу поведінку, яка наразі є типовою; ми перейдемо на PEP 517 за замовчуванням, колись у майбутньому, переходячи до цього на основі стандартних процесів. Для цього у нас також є окремі збірки, тому ви за замовчуванням встановили б колесо в цих середовищах. :)


1
На момент написання OP я вже мав wheelвстановлений пакет. Також, будь ласка, додайте посилання на PEP517.
not2qubit

У вас була встановлена ​​старіша версія setuptools або колесо? Якщо ні, це здається причиною невдачі. У будь-якому випадку, з POV pip, він не зміг побудувати колесо, і тому він встановлюється нормально.
pradyunsg

49

Вчора я отримав ту саму помилку: Failed building wheel for hddfancontrolколи біг pip3 install hddfancontrol. Результат був Failed to build hddfancontrol. Причиною було error: invalid command 'bdist_wheel'і Running setup.py bdist_wheel for hddfancontrol ... error. Помилку було виправлено, виконавши наступне:

 pip3 install wheel

( Звідси .)

Крім того, "колесо" можна завантажити безпосередньо звідси . Після завантаження його можна встановити, виконавши наступне:

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

pip3 install wheelчудово працював, бо навіть всередині 'python3 -m venv', на сьогодні я новачок у venv
Manohar Reddy Poreddy

1
навіть після встановлення колеса у мене не працює!
vatsalay

31

Оскільки, здається, ніхто не згадує про це окремо. Моє власне рішення проблеми є найбільш часто , щоб переконатися , щоб відключити кешированниє копії за допомогою: pip install <package> --no-cache-dir.


1
Якщо вашою метою є просто позбутися повідомлення, це може вважатися виправленням, інакше я б назвав це обхідним шляхом.
Нільс Магнус,

@NilsMagnus Це не просто getting rid of the message, це дозволяє продовжувати встановлення, навіть якщо інсталятор вважає, що воно вже оновлене через каталог кешу, що містить залишки попередніх та часто невдалих оновлень.
not2qubit

^^ Тим не менше, я продовжую дивуватися, чому це не поведінка за замовчуванням? Хто хоче зберігати кешовані копії під час оновлення? Просто немає ніякого сенсу.
not2qubit

4
Як це прийнята відповідь на питання? Це не відповідає на питання.
PascalIv

1
Бо він сам це запитував і теж відповідав. Я думаю, що таким чином він може прийняти власну відповідь, я вірю. Звучить дивно, але це може бути так.
Аміт Амола

4

Може бути корисним вирішити це питання з точки зору розгортання пакетів.

Є багато навчальних посібників, які пояснюють, як опублікувати пакет на PyPi. Нижче - пара, яку я використовував;

середній
справжній пітон

Мій досвід полягає в тому, що в більшості цих підручників ви використовуєте лише .tar джерела, а не колесо. Таким чином, під час встановлення пакунків, створених за допомогою цих посібників, я отримав помилку "Не вдалося побудувати колесо".

Пізніше я знайшов посилання на PyPi на документи PSF Docs Python Software Foundation . Я виявив, що процес їх налаштування та збірки дещо відрізняється, і справді включає створення файлу колеса.

Після використання офіційно задокументованого методу, я більше не отримував помилку під час встановлення моїх пакетів.

Отже, помилка може полягати лише у тому, як розробник упакував та розгорнув проект. Ніхто з нас не народився, знаючи, як користуватися PyPi, і якщо це сталося за неправильним посібником - ну, ви можете заповнити пропуски.

Я впевнений, що це не єдина причина помилки, але я готовий посперечатися, що це головна причина.


2

Спробуйте це:

sudo apt-get install libpcap-dev libpq-dev

Це спрацювало для мене, коли я встановив ці два.

Для отримання додаткової інформації дивіться посилання тут


0

На Ubuntu 18.04 я зіткнувся з цією проблемою, оскільки aptпакет для wheelне містить wheelкоманди. Я думаю, що pip намагається імпортувати wheelпакет python, і якщо це вдається, припускає, що wheelкоманда також доступна. Ubuntu порушує це припущення.

Ім'я пакета apt python3 коду python3-wheel. Він встановлюється автоматично, оскільки python3-pipрекомендує.

Названий пакет команд команди apt python3 python-wheel-common. Встановлення цього також виправляє помилки "невдалого будівельного колеса".



0

Я отримав те саме повідомлення, коли намагався встановити pip install django-imagekit. Тож я запустив колесо встановлення pip (у мене був python 2.7), а потім повторив pip install django-imagekit, і він спрацював. Дякую


0

Я хотів би додати, що якщо у вашій системі є лише Python3, то вам потрібно почати використовувати pip3 замість pip.

Ви можете встановити pip3, використовуючи таку команду;

sudo apt install python3-pip -y

Після цього ви можете спробувати встановити необхідний пакет;

sudo pip3 install <package>

0

Помилка:

Система: екземпляр aws ec2 (t2 малий)

проблема: під час встановлення opencv python через

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

Що в мене вийшло

pip3 install --upgrade pip setuptools wheel

Після цього ви все ще можете отримати помилку з помилкою

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

Встановлення libgl вирішило помилку для мене.

sudo apt update
sudo apt install libgl1-mesa-glx

Сподіваюся, це допомагає


0

У мене була та ж проблема під час встановлення Brotli

ПОМИЛКА

Failed building wheel for Brotli

Я вирішив це, завантаживши .whlфайл звідси та встановивши його за допомогою наведеної нижче команди

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

-1

Це може вам допомогти! ....

Видалення pycparser:

pip uninstall pycparser

Переінсталюйте pycparser:

pip install pycparser

У мене виникла така сама помилка під час встановлення termcolor, і я виправив її, перевстановивши.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.