Пьюсб на виндовс - бэкэнда нет

Я пытаюсь получить интерфейс моего приложения на Python с устройством NFC через USB. Наилучшим вариантом кажется pyusb, но я не могу подключить его к бэкенду libusb. Я продолжаю получать

ValueError: Бэкэнд недоступен

Я посмотрел на трассировку стека и обнаружил, что usb/backend/libusb10.py (который является частью pyusb) пытается загрузить libusb-1.0.dll использовать в качестве бэкэнда, но он не может его найти. Дело не в том, что его нет на моем пути, его нет на моем компьютере вообще!

Я установил libusb-win32 ( http://libusb.org/wiki/libusb-win32), но в результирующий каталог, похоже, входит только libusb0.dll. Где же libusb-1.0.dll???!

Я хотел бы знать, где взять эту dll, или даже другое предложение, чтобы заставить pyusb работать на Windows 7.

13 ответов

Загрузите и установите libusb-win32-devel-filter-1.2.6.0.exe. Он должен работать.

2021, и проблема все еще возникает в Windows (Windows 10). Решил установкой pyusb а также libusb и добавив путь libusb в среду Windows :

  1. pip install pyusb
  2. pip install libusb
  3. libusb-1.0.dll будет автоматически добавлен в:

\venv\Lib\site-packages\libusb\_platform\_windows\x64
а также
\venv\Lib\site-packages\libusb\_platform\_windows\x32

  1. Теперь просто добавьте эти пути в Windows Path и перезапустите CMD / PyCharm.

У меня недавно была похожая проблема, когда я пытался поговорить с USB-устройством, которое я разрабатываю. Я искал в Интернете в поисках libusb-1.0.dll и не повезло. Я нашел исходный код, но ничего не построено и не готово к установке. Я закончил тем, что установил двоичные файлы libusb-win32, которые являются libusb0.dll.

PyUSB будет искать бэкэнды libusb-1.0, libusb0 и openUSB.

libusb0.dll уже был в моей системе, но что-то все еще не было настроено правильно, у PyUSB не работал.

Я следовал приведенным здесь инструкциям для загрузки и установки драйвера, используя инструменты с графическим интерфейсом, предоставленные для установки драйвера фильтра, и мастер INF. Обратите внимание, что это не сработало, пока я не запустил мастер INF.

Я довольно новичок в программировании, и я обнаружил отсутствие четкой документации / примеров, чтобы связать все это вместе довольно разочаровывающе.

Есть более простое решение.

Загрузите и распакуйте в C:\PATH libusb-1.0.20 по ссылке для скачивания

Затем попробуйте эту строку:

backend = usb.backend.libusb1.get_backend (find_library = lambda x: "C:\PATH \ libusb-1.0.20 \ MS32 \ dll \ libusb-1.0.dll")

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

В зависимости от вашей системы попробуйте версию DLL MS64 или MS32.

Обновление от 17.01.2020, после просьбы поделиться дополнительным кодом:

import usb.core
import usb.util

from infi.devicemanager import DeviceManager
dm = DeviceManager()
devices = dm.all_devices
for i in devices:
    try:
        print ('{} : address: {}, bus: {}, location: {}'.format(i.friendly_name, i.address, i.bus_number, i.location))
    except Exception:
        pass


import usb.backend.libusb1

backend = usb.backend.libusb1.get_backend(find_library=lambda x: "C:\\libusb-1.0.20\\MS32\\dll\\libusb-1.0.dll")
dev = usb.core.find(backend=backend, find_all=True)

def EnumerateUSB():    #I use a simple function that scans all known USB connections and saves their info in the file
    with open("EnumerateUSBLog.txt", "w") as wf:
        counter = 0
        for d in dev:
            try:
                wf.write("USB Device number " + str(counter) + ":" + "\n")
                wf.write(d._get_full_descriptor_str() + "\n")
                wf.write(d.get_active_configuration() + "\n")
                wf.write("\n")
                counter += 1
            except NotImplementedError:
                wf.write("Device number " + str(counter) + "is busy." + "\n")
                wf.write("\n")
                counter += 1
            except usb.core.USBError:
                wf.write("Device number " + str(counter) + " is either disconnected or not found." + "\n")
                wf.write("\n")
                counter += 1
        wf.close()

Я использую Python 2.6.5, libusb-win32-device.bin-0.1.12.1 а также pyusb-1.0.0-a0 в системе Windows XP и продолжал получать ValueError: No backend available,

Поскольку в Интернете не было никакой реальной помощи по этой проблеме, я потратил много времени, чтобы найти это ctypes util.py использует Path переменная, чтобы найти файл библиотеки. мой path не включал windows\system32 а также PYUSB не нашел библиотеку. Я обновил path переменная и теперь USB работает.

У меня была та же проблема с Windows 10, и Python 2.7.16, и Python 3.7.2. Я установил libusb (через python -m pip install libusb) но сообщение об ошибке осталось. Кроме того, приведенный выше совет по установке libusb-win32 у меня не сработал; ни одна из двух ссылок (оригинальный пост и ответ @beebek) не существовала.

Что же сработало, так это комментарий @user1495323: я скопировал libusb-1.0.dll от C:\Users\username\AppData\Roaming\Python\Python27\site-packages\libusb\_platform\_windows\x64\в C:\Windows\System32\

Были некоторые проблемы с бэкендом, недоступным в 2022 году, когда я устанавливал pyusb и libusb на свою Windows x64.


Я нашел способ решить эту проблему, читая -> Github решить, объясняя

Чтобы решить, сначала вам нужно скопировать путь к libusb-1.0.dll (..\envs<your_env_name>\Lib\site-packages\libusb_platform_windows\x64) в системной переменной PATH.

Во- вторых , перезапустите IDE.

Третья попытка get_backend использовать usb.backend:

      import usb.core
from usb.backend import libusb1

# it should find libusb-1.0.dll at our path variable
back = libusb1.get_backend()
print(type(back))  # return: <class 'usb.backend.libusb1._LibUSB'>

dev = usb.core.find(backend=back)
print(type(dev))  # return: <class 'usb.core.Device'>

# flag 'find_all=True' would return generator
# reprecent connected usb devices

dev_list = usb.core.find(find_all=True, backend=back)
print(type(dev_list)) # return: <class 'generator'>

Если спина NoneType, это означает get_backend()не нашел libusb-1.0.dll или нашел неправильный usblib (и это было моей проблемой - я скопировал путь переменной atPATH к файлу _x86 на моей машине x64).


Другой способ решить эту проблему -> скопировать libusb-1.0.dll из (.._x64\libusb-1.0.dll) в (C:\Windows\System32) .

  1. скачать последнюю версию libusb Загрузить libusb

Скопируйте MS32\dll\libusb-1.0.dll в C:\Windows\SysWOW64

Скопируйте MS64\dll\libusb-1.0.dll в C: \ Windows \ System32

3.

pip install libusb

Скопируйте MS32\dll\libusb-1.0.dll в C:\Python\Python37-32\Lib\site-packages\libusb_platform_windows\x86

Скопируйте MS64\dll\libusb-1.0.dll в C:\Python\Python37-32\Lib\site-packages\libusb_platform_windows\x64

У меня этот метод работает.

Это смесь нескольких ответов и вот готовое решение для 64-разрядной версии Windows:

  • Бегать:

            pip install pyusb
    pip install libusb
    
  • Делать:

            import usb.backend.libusb1
    backend = usb.backend.libusb1.get_backend(find_library=lambda x: r"C:\Python38\Lib\site-packages\libusb\_platform\_windows\x64\libusb-1.0.dll")  # adapt to your path
    usb_devices = usb.core.find(backend=backend, find_all=True)
    for usb_device in usb_devices:
        print(usb_device)
    

Сделанный!

"Существует две версии API libusb: текущая libusb-1.0 API и его предшественник libusb-0.1. "( http://www.libusb.org/)"libusb-win32 это порт библиотеки USBlibusb-0.1 к операционной системе Microsoft Windows ". " Загрузите архив с последней версией "с той же страницы (1.0.9 текущая версия) иметь libusb-1.0 эквивалент, вы найдете папку Win32где вы найдете свой libusb-1.0.dll играть с! Вы даже можете создать его: http://www.libusb.org/wiki/windows_backend.

РЕДАКТИРОВАТЬ Вы должны создать его (загрузить с / http://sourceforge.net/projects/libusb/files/libusb-1.0/), так как тарбол выпущен в 2012 году, а последние источники - в 2014-06-15.

Бэкэнд libusb инициализируется сценарием python в пути /usb путем загрузки двоичной DLL из Windows PATH, если она пропущена или установлена ​​фиктивной DLL zadig, она будет жаловаться на это, потому что DLL, установленная zadig, не экспортирует любой символ за пределами мира (фиктивный, я думаю)

Так, на всякий случай:

Я не пробовал это в Windows, но мне пришлось установить путь DYLD_LIBRARY_PATH, чтобы обойти эту ошибку на Macintosh.

export DYLD_LIBRARY_PATH = / opt / local / lib

Обсуждение того, стоит ли устанавливать эту переменную, находится здесь.

Чтобы подключиться к устройству NFC через USB с помощью PYUSB, вам необходимо установить бэкэнд для этого устройства. Я не думаю, что есть какой-либо бэкэнд для какого-либо устройства, кроме устройства libusb.

Чтобы построить бэкэнд. Вам нужно будет знать драйвер (файл.sys) для вашего устройства, чтобы вы могли написать DLL-оболочку для предоставления функциональных возможностей устройства. Ваша DLL должна иметь метод для поиска устройства на основе PID & VID, другой метод для открытия устройства и другой метод для отправки данных и так далее...

Другие вопросы по тегам