Ошибка usb core NoBackendError No backend available: причины и решение

Ошибка usb.core.NoBackendError: No backend available возникает в скриптах на Python при вызове usb.core.find() или usb.core.show_devices(), когда библиотека PyUSB не может найти ни одного работающего backend — то есть низкоуровневой библиотеки для доступа к USB-шине. Сам PyUSB — это лишь обёртка: реальную работу с устройствами выполняют libusb-1.0, libusb-0.1 или OpenUSB, и если ни одна из них не обнаружена в системе, интерпретатор выбрасывает именно это исключение.

Типичная ситуация: скрипт для работы с USB-устройством (программатором, сканером, осциллографом, принтером) корректно написан, зависимости установлены через pip install pyusb, но при запуске программа падает с трейсбеком на строке поиска устройства. Проблема почти всегда решается на уровне системы, а не кода — ниже разберём диагностику и исправление для Windows, Linux и macOS.

Что означает ошибка NoBackendError

Исключение NoBackendError выбрасывается модулем usb.core, когда функция поиска backend проходит по всем известным ей реализациям и не получает ни одного валидного объекта. Проще говоря, PyUSB не нашёл в системе разделяемую библиотеку, через которую можно обращаться к USB-контроллеру.

Ключевые термины, которые помогут в диагностике:

  • 🔌 Backend — низкоуровневая библиотека (например, libusb-1.0), выполняющая реальные вызовы к ОС;
  • 📦 PyUSB — Python-пакет, предоставляющий удобный API поверх backend;
  • 🧩 libusb-1.0 — самая распространённая кроссплатформенная библиотека доступа к USB;
  • 🛠️ Драйвер устройства — на Windows часто требуется замена штатного драйвера на WinUSB или libusbK.

Важно разделять два разных сценария: backend не найден вообще (ошибка возникает при любом вызове) и backend есть, но устройство не открывается. Текст «No backend available» относится именно к первому случаю — библиотека не загружена или не найдена в путях поиска.

Быстрая диагностика: как проверить, видит ли PyUSB backend

Прежде чем что-то переустанавливать, стоит подтвердить диагноз. Запустите Python и выполните простую проверку:

import usb.core

import usb.util

dev = usb.core.find(find_all=True)

print(list(dev))

Если вместо списка устройств вы получаете NoBackendError, проблема подтверждена. Дополнительно можно вручную запросить конкретный backend и посмотреть, что вернётся:

import usb.backend.libusb1

backend = usb.backend.libusb1.get_backend()

print(backend)

Если результат — None, значит, разделяемая библиотека libusb-1.0 не найдена. Учтите: на Windows модуль ищет DLL по стандартным путям (системные каталоги, PATH, папка скрипта), на Linux — через механизм загрузчика (ldconfig), на macOS — в типовых путях вроде /usr/local/lib или каталогов Homebrew.

📊 На какой системе вы столкнулись с NoBackendError?
Windows
Linux
macOS
Виртуальная машина / Docker

Решение для Windows: установка libusb и драйвера

На Windows чаще всего отсутствует сама DLL-библиотека libusb-1.0. Необходимо скачать официальный релиз libusb с сайта проекта или репозитория на GitHub и поместить файл libusb-1.0.dll туда, где Python сможет его найти — например, в папку со скриптом или в каталог, прописанный в PATH.

Обратите внимание на разрядность: для 64-битного Python нужна 64-битная версия DLL, для 32-битного — 32-битная. Несовпадение разрядности — частая скрытая причина, когда «файл вроде есть, а backend всё равно не находится».

⚠️ Внимание: скачивайте DLL только с официальных источников проекта libusb. Сторонние «сборники DLL» нередко содержат устаревшие или модифицированные файлы, что создаёт риски безопасности.

Второй этап — драйвер устройства. Даже с установленной libusb Windows может не отдать доступ к устройству, если оно обслуживается штатным драйвером. В этом случае применяют утилиту Zadig, которая подменяет драйвер конкретного устройства на WinUSB или libusbK. Порядок действий:

  • 🔍 Запустите Zadig и включите показ всех устройств через меню Options → List All Devices;
  • 🎯 Выберите в списке нужное USB-устройство (сверьтесь по VID/PID, чтобы не перепутать);
  • ⚙️ Установите драйвер WinUSB или libusbK для этого устройства;
  • 🔄 Перезапустите скрипт и проверьте, прошла ли ошибка.

⚠️ Внимание: замена драйвера через Zadig делает устройство недоступным для его штатных программ (например, фирменной утилиты производителя) до тех пор, пока вы не вернёте оригинальный драйвер через «Диспетчер устройств». Не меняйте драйверы клавиатур, мышей и системных хабов.

Решение для Linux: пакет libusb и права доступа

В дистрибутивах Linux библиотека устанавливается из штатных репозиториев. В Debian/Ubuntu это делается так:

sudo apt install libusb-1.0-0

В Fedora и родственных системах пакет обычно называется libusb1 или libusbx — точное имя стоит уточнить через поиск пакетного менеджера вашего дистрибутива. После установки перезапустите скрипт: в большинстве случаев backend подхватывается автоматически.

Если backend нашёлся, но устройство не открывается с ошибкой доступа — дело в правах. USB-устройства в Linux доступны через /dev/bus/usb, и обычному пользователю может не хватать разрешений. Быстрая проверка — запуск скрипта через sudo: если ошибка исчезла, нужно настроить правило udev, дающее доступ вашей группе пользователей к устройству с конкретными VID/PID. Создание и синтаксис таких правил описаны в документации вашего дистрибутива.

Решение для macOS и виртуальных окружений

На macOS библиотеку проще всего поставить через Homebrew:

brew install libusb

После установки убедитесь, что Python ищет библиотеки в каталоге, куда Homebrew разместил файл — путь различается для Mac на Intel и Apple Silicon. При необходимости путь к DLL/dylib можно передать явно через параметр find_library при создании backend в коде.

Отдельный частый сценарий — Docker-контейнеры и виртуальные машины. Внутри контейнера нет ни библиотеки, ни доступа к USB-шине хоста: потребуется установить libusb в образ и пробросить устройство (в Docker — флаг --device или привилегированный режим, в VirtualBox/VMware — подключение USB-устройства к гостевой системе в настройках). Без проброса устройства никакая установка библиотеки внутри изолированной среды не поможет.

Как явно указать путь к библиотеке в коде

Если автопоиск не работает, backend можно создать вручную: usb.backend.libusb1.get_backend(find_library=lambda x: "/полный/путь/libusb-1.0.dll"). Это помогает, когда DLL лежит в нестандартном каталоге или рядом со скриптом в переносимой сборке.

Пошаговый чек-лист устранения ошибки

Соберём всё в единый порядок действий — от простого к сложному. Двигайтесь по пунктам и после каждого проверяйте, исчезла ли ошибка.

☑️ Диагностика NoBackendError

Выполнено: 0 / 6

Если ни один шаг не помог, проверьте, не конфликтует ли с интерпретатором другое окружение Python (например, системный и виртуальное окружение с разными версиями пакетов), и попробуйте переустановить PyUSB командой pip install --force-reinstall pyusb.

Типичные причины ошибки — сводная таблица

ПричинаОСПризнакРешение
Не установлена libusb-1.0Всеget_backend() возвращает NoneУстановить библиотеку
Несовпадение разрядности DLLWindowsDLL есть, backend не найденDLL под разрядность Python
Штатный драйвер устройстваWindowsBackend есть, устройство не открываетсяZadig → WinUSB/libusbK
Нет прав на /dev/bus/usbLinuxПод sudo работаетПравило udev
Изолированная средаDocker/VMУстройство не видно внутри средыПроброс USB + libusb в образе

Часто задаваемые вопросы

Установил pyusb через pip — почему ошибка не исчезла?

Пакет PyUSB — только Python-обёртка. Он не включает в себя низкоуровневую библиотеку libusb-1.0, которую нужно установить отдельно средствами ОС или вручную.

Как узнать, какой backend использует PyUSB?

Выполните в интерпретаторе: import usb.backend.libusb1; print(usb.backend.libusb1.get_backend()). Если вернулся объект backend — библиотека найдена; если None — нет.

Ошибка появляется только в Docker-контейнере. Что делать?

Установите libusb внутрь образа и пробросьте USB-устройство в контейнер (например, через --device). Без доступа к USB-шине хоста backend внутри контейнера работать не сможет.

После Zadig перестала работать фирменная программа устройства. Как вернуть?

Откройте «Диспетчер устройств», найдите устройство и выберите обновление драйвера с автоматическим поиском — Windows восстановит штатный драйвер. Для скрипта придётся снова назначить WinUSB, поэтому удобно держать оба сценария под контролем.

Поддерживается ли libusb-0.1 вместо libusb-1.0?

PyUSB умеет работать с устаревшей libusb-0.1, но её функциональность ограничена, а в современных системах она обычно отсутствует. Рекомендуемый вариант — libusb-1.0.