Пьюсб на виндовс - бэкэнда нет
Я пытаюсь получить интерфейс моего приложения на 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 :
-
pip install pyusb
-
pip install libusb
-
libusb-1.0.dll
будет автоматически добавлен в:
\venv\Lib\site-packages\libusb\_platform\_windows\x64
а также
\venv\Lib\site-packages\libusb\_platform\_windows\x32
- Теперь просто добавьте эти пути в 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) .
скачать последнюю версию 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, другой метод для открытия устройства и другой метод для отправки данных и так далее...