Windows 上的 Pyusb - 没有可用的后端

Posted

技术标签:

【中文标题】Windows 上的 Pyusb - 没有可用的后端【英文标题】:Pyusb on windows - no backend available 【发布时间】:2012-11-26 05:23:01 【问题描述】:

我正在尝试通过 USB 将我的 Python 应用程序接口与 NFC 设备连接。 最好的选择似乎是PyUSB,但我无法让它连接到 libusb 后端。 我不断得到

ValueError:没有可用的后端

我查看了堆栈跟踪,发现 usb/backend/libusb10.py(它是 pyusb 的一部分)正在尝试加载 libusb-1.0.dll 以用作后端,但找不到它。不是不在我的路径上,而是根本不在我的电脑上!

我已经安装了libusb-win32,但生成的目录似乎只包含 libusb0.dll。 libusb-1.0.dll 在哪里???!

我很想知道从哪里获取该 dll,甚至想知道让 PyUSB 在 Windows 7 上运行的不同建议。

【问题讨论】:

【参考方案1】:

2021 并且问题仍然出现在 Windows (Windows 10) 上。我通过安装 pyusblibusb 并将 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 路径并重新启动 CMD / PyCharm

【讨论】:

已经安装了这些包,并在我的 Win-10 机器上的 Path Env 变量中包含了路径。但是,运行这行代码仍然会抛出 "No Backenderror" import usb for dev in usb.core.find(find_all=True): print("Devices - " + dev) @AshwinKumar - 你确定你安装了正确的库吗?有一个pylibusb,这不是您应该安装的。此外,请确保在更新 Windows 路径后重新启动 PyCharm / CMD(否则将无法正常工作)。也许尝试从一个干净的venv开始 我已经安装了你提到的包。这是显示相同的屏幕截图 - file.io/EYaucUUluN9e 已在此处上传我的代码屏幕截图 file.io/MyORGzN3zJF0 如果我遗漏任何内容,请告诉我。您必须原谅任何基本错误 - 我不是活跃的开发人员:-) @AshwinKumar - 我无法打开链接,要么上传到 Imgur,要么尝试通过在第 92 行 for candidate in candidateslibloader.py(位于 /venv/Lib/site-packages/usb)中设置断点来调试它,继续第二次迭代直到candidate == libusb-1.0,进入find_library(),继续直到directory是你添加到Path的路径,然后看看os.path.isfile(fname)返回什么【参考方案2】:

libusb后端由/usb路径中的python脚本初始化,通过从Windows PATH加载二进制DLL,如果zadig的虚拟DLL丢失或安装,它会抱怨这个。因为zadig安装的DLL没有't 将任何符号导出到外部世界(我猜是虚拟的)

【讨论】:

【参考方案3】:

下载并安装libusb-win32-devel-filter-1.2.6.0.exe。它应该可以工作。

【讨论】:

【参考方案4】:

    下载最新的libusb Download libusb

复制MS32\dll\libusb-1.0.dllC:\Windows\SysWOW64

复制MS64\dll\libusb-1.0.dllC:\Windows\System32

3.

pip install libusb

复制MS32\dll\libusb-1.0.dllC:\Python\Python37-32\Lib\site-packages\libusb_platform_windows\x86

复制MS64\dll\libusb-1.0.dllC:\Python\Python37-32\Lib\site-packages\libusb_platform_windows\x64

这个方法对我有用。

【讨论】:

【参考方案5】:

有一个更简单的解决方案。

从download link 下载libusb-1.0.20并解压到C:\PATH

然后试试这一行:

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)

根据您的系统,尝试使用 MS64 或 MS32 版本的 .dll

2020 年 1 月 17 日更新,请求分享更多代码后:

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()

【讨论】:

【参考方案6】:

我在 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\

【讨论】:

【参考方案7】:

以防万一:

我没有在 Windows 上尝试过这个,但我必须设置 DYLD_LIBRARY_PATH 路径来规避 Macintosh 上的这个错误。

导出 DYLD_LIBRARY_PATH=/opt/local/lib

关于是否设置这个变量的讨论是here。

【讨论】:

【参考方案8】:

“libusb API 有两个版本:当前的 libusb-1.0 API 和它的旧版本 libusb-0.1。” (http://www.libusb.org/) “libusb-win32 是 USB 库libusb-0.1 到 Microsoft Windows 操作系统的端口”。从same page(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/ 下载),因为 tarball 来自 2012,而最新的来源来自 2014-06-15。

【讨论】:

【参考方案9】:

要使用 PYUSB 通过 USB 连接到您的 NFC 设备,您需要为该设备安装后端。我认为除了 libusb 设备之外的任何设备都没有任何后端。

构建后端。您需要知道设备的驱动程序(.sys 文件),因此您可以编写一个包装 DLL 来公开设备中的功能。您的 DLL 必须有一种基于 PID 和 VID 查找设备的方法、另一种打开设备的方法和另一种发送数据的方法等等......

【讨论】:

【参考方案10】:

我在 Windows XP 系统上使用 Python 2.6.5、libusb-win32-device.bin-0.1.12.1pyusb-1.0.0-a0 并不断收到 ValueError: No backend available

由于网络上没有针对此问题的任何真正帮助,我花了很多时间发现ctypes util.py 使用Path 变量来查找库文件。我的path 不包括windows\system32PYUSB 没有找到图书馆。我更新了 path 变量,现在 USB 可以工作了。

【讨论】:

鉴于这是关于 XP 的(并且 OP 要求回复:Windows 7),作为评论可能会更好。 我将当前文件夹添加到PATH【参考方案11】:

我最近尝试与我正在开发的 USB 设备通信时遇到了类似的问题。我在网上搜寻 libusb-1.0.dll 并没有运气。我找到了源代码,但没有构建并准备安装。我最终安装了 libusb-win32 二进制文件,即 libusb0.dll。

PyUSB 将搜索 libusb-1.0、libusb0 和 openUSB 后端。

libusb0.dll 已经在我的系统上,但仍有一些设置不正确,PyUSB 是否无法正常工作。

我按照here 的指示使用提供的用于安装过滤器驱动程序的 GUI 工具和 INF 向导下载并安装驱动程序。请注意,在我运行 INF 向导之前它不起作用。

我对编程很陌生,而且我发现缺乏清晰的文档/示例来将所有这些都串在一起相当令人沮丧。

【讨论】:

是的,运行 inf-wizard 并选择要启动的设备。 @jonincanada 似乎我遇到了与 Garrett Hyde 相同的问题。但不同的是我已经下载并解压缩了文件(libusb1.0.20),然后复制了一个dll文件,特别是(libusb-1.0.dll)并将其复制到系统32;然后我将 libusb-1.lib 复制到 python34/Lib。仍然出现“无后端”错误,您能帮我解决问题吗? Adafruit 有一个很好的指南,让 pyusb 在 Windows 上工作:learn.adafruit.com/circuitpython-on-any-computer-with-ft232h/…

以上是关于Windows 上的 Pyusb - 没有可用的后端的主要内容,如果未能解决你的问题,请参考以下文章

PyUSB ValueError:没有可用的后端

已安装 libusb - 但未找到 pyUSB 后端

Windows 7 上的 Pyusb 找不到任何设备

pyusb 2.7 windows安装错误

设备在 PyUSB 上不可用

如何使用 pyusb 控制 Xbox 360 游戏手柄上的 LED