Pyusb on windows - no backend available
Asked Answered
M

14

45

I'm trying to have my Python application interface with an NFC device via USB. The best option seems to be PyUSB, but I can't get it to connect to the libusb backend. I keep getting

ValueError: No backend available

I've looked at the stack trace, and found that usb/backend/libusb10.py (which is part of pyusb) is trying to load libusb-1.0.dll to use as the backend, but it can't find it. It's not that it's not in my path, it's not on my computer at all!

I have installed libusb-win32, but the resulting directory only seems to include libusb0.dll. Where is libusb-1.0.dll???!

I would love to know either where to get that dll, or even a different suggestion to get PyUSB to work on Windows 7.

Monoplegia answered 8/12, 2012 at 0:25 Comment(0)
A
26

Download and install libusb-win32-devel-filter-1.2.6.0.exe. It should work.

Antoniettaantonin answered 10/7, 2015 at 3:46 Comment(1)
libusb-win32 from sourceforge is very outdated, last release in 2012. If you're using anything recent consider downloading from libusb.infoPotato
S
13

2021 and the problem still occurs on Windows (Windows 10). I solved it by installing pyusb and libusb and adding libusb path to Windows environment:

  1. pip install pyusb
  2. pip install libusb
  3. libusb-1.0.dll will be automatically added to:

\venv\Lib\site-packages\libusb\_platform\_windows\x64
and
\venv\Lib\site-packages\libusb\_platform\_windows\x32

  1. Now just add those paths (the full path) to Windows Path and restart CMD / PyCharm.
Sesame answered 21/6, 2021 at 7:56 Comment(6)
Have installed these packages and included the paths in Path Env Variable on my Win-10 machine. However, running this line of code still throws the "No Backenderror" import usb for dev in usb.core.find(find_all=True): print("Devices - " + dev)Mimimimic
@AshwinKumar - Are you sure you installed the correct libraries? There's a pylibusb which is not what you should install. Also, make sure to restart PyCharm / CMD after updating Windows Path (it won't work otherwise). Maybe try to start from a clean venvSesame
I have installed the package you are mentioning. Here is the screenshot showing same - file.io/EYaucUUluN9e Have uploade the screenshot of my code here file.io/MyORGzN3zJF0 Please let me know if I am missing anything. You have to excuse any basic mistake - I am not an active developer :-)Mimimimic
@AshwinKumar - I can't open the links, either uploda to Imgur, or try to debug it by setting a breakpoint in libloader.py (located in /venv/Lib/site-packages/usb) on line 92 for candidate in candidates, continue to the 2nd iteration until candidate == libusb-1.0, step in to find_library(), and continue until directory is the path you added to the Path, then see what os.path.isfile(fname) returnsSesame
@AlaaM. thanks, this helped. However, I can't believe that the original idea is to add everything to the Windows PATH environment variable. Well, if you just pip install libusb and Python doesn't find it, my question would be: where does Python actually look for it? Do you or anyone know?Maplemaples
Thank you. Can't believe that I wasted 3h on that.Quadrisect
C
8

I had a similar issue recently trying to talk to a USB device I am developing. I scoured the web looking for libusb-1.0.dll's and had no luck. I found source code, but nothing built and ready to install. I ended up installing the libusb-win32 binaries, which is the libusb0.dll.

PyUSB will search for libusb-1.0, libusb0, and openUSB backends.

libusb0.dll was already on my system, but something was still not set up right, do PyUSB was not working.

I followed the directions here to download and install the driver using the GUI tools provided to install the filter driver, and the INF wizard. Note, it didn't work until I ran the INF wizard.

I'm pretty new to programming and I've found the lack of clear documentation/examples to string this all together rather frustrating.

Civilized answered 26/12, 2012 at 22:4 Comment(3)
Yes, run the inf-wizard and select your device to start.Harlot
@Harlot it seems that i have run into the same problem as Garrett Hyde. but the difference is that i have downloaded and unzipped the file(libusb1.0.20),then copied a dll file, specifically(libusb-1.0.dll) and copied it to system 32; then i copied libusb-1.lib to python34/Lib. and still there is 'no backend' error,so can you help me solve the problem?Selfeffacement
Adafruit has a good guide on getting pyusb working on Windows: learn.adafruit.com/circuitpython-on-any-computer-with-ft232h/…Pinwork
S
8

There's a simpler solution.

Download and unpack to C:\PATH the libusb-1.0.20 from download link

Then try this line:

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

Depending on your system, try either MS64 or MS32 version of the .dll

import usb.core
import usb.util
import usb.backend.libusb1

from infi.devicemanager import DeviceManager

dm = DeviceManager()
devices = dm.all_devices
for d in devices:
    try:
        print(f'{d.friendly_name} : address: {d.address}, bus: {d.bus_number}, location: {d.location}')
    except Exception:
        pass


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


def enumerate_usb():  # 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:
        for i, d in enumerate(usb_devices):
            try:
                wf.write(f"USB Device number {i}:\n")
                wf.write(d._get_full_descriptor_str() + "\n")
                wf.write(d.get_active_configuration() + "\n")
                wf.write("\n")
            except NotImplementedError:
                wf.write(f"Device number {i} is busy.\n\n")
            except usb.core.USBError:
                wf.write(f"Device number {i} is either disconnected or not found.\n\n")
Selfwinding answered 3/10, 2019 at 6:36 Comment(0)
N
6

I am using Python 2.6.5, libusb-win32-device.bin-0.1.12.1 and pyusb-1.0.0-a0 on a windows XP system and kept receiving ValueError: No backend available.

Since there wasn't any real help on the web for this problem I spent a lot of time finding that ctypes util.py uses the Path variable to find the library file. My path did not include windows\system32 and PYUSB didn't find the library. I updated the path variable and now the USB is working.

Ns answered 30/4, 2013 at 20:45 Comment(2)
Given that this is about XP (and the OP was asking Re: Windows 7) this might have been better as a comment.Halflife
I added the current folder to the PATH.Adar
N
5

I had the same problem with Windows 10, both Python 2.7.16 and Python 3.7.2. I installed libusb (through python -m pip install libusb ) but the error message remained. Also, the advice above about installing libusb-win32 did not work for me; neither of the 2 links (original post and @beebek's answer) existed.

What did work, however, is the comment by @user1495323 : I copied libusb-1.0.dll from C:\Users\username\AppData\Roaming\Python\Python27\site-packages\libusb\_platform\_windows\x64\ to C:\Windows\System32\

Nisen answered 15/3, 2019 at 12:23 Comment(0)
U
3

Had some problems with backendnotavailable at 2022 when I install pyusb and libusb on my Windows x64.


I've found a way to solve it reading -> Github solve explaining

To solve, first you need copy path to libusb-1.0.dll (..\envs<your_env_name>\Lib\site-packages\libusb_platform_windows\x64) at system's PATH variable.

Secondly restart IDE.

Third try to get_backend use 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'>

If back is a NoneType, that means get_backend() hasn't found libusb-1.0.dll or found the wrong usblib (and that was my problem - I copied atPATH variable path to _x86 file, on my x64 machine).


Another way to solve it -> copy libusb-1.0.dll from (.._x64\libusb-1.0.dll) to (C:\Windows\System32).

Unemployable answered 14/1, 2022 at 12:1 Comment(0)
C
2
  1. download the latest libusb Download libusb

Copy MS32\dll\libusb-1.0.dll to C:\Windows\SysWOW64

Copy MS64\dll\libusb-1.0.dll to C:\Windows\System32

3.

pip install libusb

Copy MS32\dll\libusb-1.0.dll to C:\Python\Python37-32\Lib\site-packages\libusb_platform_windows\x86

Copy MS64\dll\libusb-1.0.dll to C:\Python\Python37-32\Lib\site-packages\libusb_platform_windows\x64

This method works for me.

Cribbs answered 26/6, 2020 at 2:32 Comment(0)
A
1

"There are two versions of the libusb API: the current libusb-1.0 API, and its legacy predecessor libusb-0.1." (http://www.libusb.org/) "libusb-win32 is a port of the USB library ​libusb-0.1 to the Microsoft Windows operating systems". "Download the latest release tarball" from the same page (1.0.9 is the current version) to have libusb-1.0 equivalent, you'll find a folder Win32, where you'll find your libusb-1.0.dll to play with! You can even build it: http://www.libusb.org/wiki/windows_backend.

EDIT You have to build it (download from/ http://sourceforge.net/projects/libusb/files/libusb-1.0/) since the tarball is from 2012, while the latest sources are from 2014-06-15.

Adar answered 16/9, 2014 at 12:49 Comment(0)
C
1

This is a mix from multiple answers and here a ready-to-use solution for Windows x64 bit:

  • Run:

    pip install pyusb
    pip install libusb
    
  • Do:

    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)
    

Done!

Chug answered 6/9, 2023 at 14:39 Comment(2)
You might consider libusb.__file__.replace('__init__.py', r'_platform\_windows\x64\libusb-1.0.dll') to avoid the hard-coded path to the Python installation directory. (This still assumes that the location of the dll within the libusb package is fixed though.)Yea
Alternatively: next(pathlib.Path(libusb.__file__).parent.rglob('x64/libusb-1.0.dll')), which searches for a file x64/libusb-1.0.dll inside the libusb directory. Free free to incorporate this into your answer if you like.Yea
T
0

To connect to your NFC device via USB using PYUSB, you will need to install the backend for that device. I do not think there is any backend for any device other than a libusb device.

To build a backend. You will need to know the driver (.sys file) for your device, so you could write a wrapper DLL to expose functionalities in the device. Your DLL would have to have a method to find device based on PID & VID, another method to open device and another method to send data and so on...

Torrens answered 6/8, 2014 at 18:55 Comment(0)
L
0

Just in case:

I haven't tried this on Windows but I had to set DYLD_LIBRARY_PATH path to circumvent this error on the Macintosh.

export DYLD_LIBRARY_PATH=/opt/local/lib

Discussion on whether or not to set this variable is here.

Lelea answered 15/3, 2015 at 9:15 Comment(0)
A
0

The libusb backend is initialized by the python script in /usb path,by loading the binary DLL from Windows PATH,if it's missed or installed by the zadig's dummy DLL,it will complained about this.Because the DLL installed by zadig doesn't exports any symbol to outside wolrd(dummy one I guess)

Anomalism answered 2/1, 2021 at 10:12 Comment(0)
K
0

I had same the same problem on Windows 11. I tried to install libusb-win32 from https://github.com/mcuee/libusb-win32/releases and it still didn't work.

My working solution:

  1. Install libusb_package via pip install libusb_package. It also install needed DLL libraries to your current python environment near to the library itself.
  2. Specify backend in your code like this:
import usb.core
from usb.backend import libusb1
import libusb_package

backend = libusb1.get_backend(find_library=libusb_package.find_library)

vendor_id = 0x2708
product_id = 0x0003

device = usb.core.find(
            idVendor=vendor_id,
            idProduct=product_id,
            backend=backend,
        )
...
Koester answered 25/6 at 22:17 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.