Python windows上的Pyusb-没有可用的后端
我正在尝试通过USB将python应用程序接口与NFC设备连接起来。 最好的选择似乎是pyusb,但我无法让它连接到libusb后端。 我一直在 ValueError:没有可用的后端 我查看了堆栈跟踪,发现Python windows上的Pyusb-没有可用的后端,python,windows-7,libusb,pyusb,Python,Windows 7,Libusb,Pyusb,我正在尝试通过USB将python应用程序接口与NFC设备连接起来。 最好的选择似乎是pyusb,但我无法让它连接到libusb后端。 我一直在 ValueError:没有可用的后端 我查看了堆栈跟踪,发现usb/backend/libusb10.py(它是pyusb的一部分)正在尝试加载libusb-1.0.dll,以用作后端,但它找不到它。这不是说它不在我的路径上,它根本不在我的计算机上 我已经安装了libusb-win32(),但生成的目录似乎只包含libusb0.dll。libusb-1
usb/backend/libusb10.py
(它是pyusb的一部分)正在尝试加载libusb-1.0.dll
,以用作后端,但它找不到它。这不是说它不在我的路径上,它根本不在我的计算机上
我已经安装了libusb-win32(),但生成的目录似乎只包含libusb0.dll。libusb-1.0.dll在哪里
我很想知道从哪里获得dll,甚至想知道让pyusb在Windows7上工作的不同建议 我最近在尝试与正在开发的USB设备通话时遇到了类似的问题。我在网上搜索libusb-1.0.dll,但没有找到任何运气。我找到了源代码,但没有生成任何可安装的代码。我最后安装了libusb-win32二进制文件,即libusb0.dll PyUSB将搜索libusb-1.0、libusb0和openUSB后端 libusb0.dll已在我的系统上,但某些设置仍然不正确,do PyUSB不工作 我按照说明使用安装过滤器驱动程序所提供的GUI工具和INF向导下载并安装驱动程序。注意,直到我运行INF向导,它才起作用
我对编程非常陌生,我发现缺乏清晰的文档/示例来将这些内容组合在一起相当令人沮丧。我在windows XP系统上使用Python2.6.5、
libusb-win32-device.bin-0.1.12.1
和pyusb-1.0.0-a0
,并不断收到ValueError:No backend available
由于这个问题在web上没有任何真正的帮助,我花了很多时间发现
ctypes util.py
使用Path
变量来查找库文件。我的路径
未包含windows\system32
并且PYUSB
未找到库。我更新了路径
变量,现在USB正在工作。要使用PYUSB通过USB连接到NFC设备,您需要为该设备安装后端。我认为除了libusb设备之外,没有任何其他设备的后端
来构建后端。您需要知道设备的驱动程序(.sys文件),以便编写包装器DLL来公开设备中的功能。您的DLL必须有一个基于PID和VID查找设备的方法,另一个打开设备的方法和另一个发送数据的方法等等……“libusb API有两个版本:当前的libusb-1.0
API,以及它的旧版本libusb-0.1
”(libusb-win32
是USB库的一个端口<代码>libusb-0.1到Microsoft Windows操作系统”。从(1.0.9
是当前版本)下载最新版本的tarball要想拥有与之相当的libusb-1.0
,你会找到一个文件夹Win32
,在那里你可以找到你的libusb-1.0.dll
!您甚至可以构建它:
编辑
您必须构建它(从/下载),因为tarball是从2012年开始的,而最新的来源是从2014年6月15日开始的。以防万一:
我没有在Windows上尝试过这个,但我必须在Macintosh上设置DYLD_LIBRARY_PATH来避免这个错误
导出动态库路径=/opt/local/lib
是否设置此变量的讨论正在进行。下载并安装。它应该可以工作。我在Windows 10上遇到了同样的问题,包括Python 2.7.16和Python 3.7.2。我安装了libusb(通过python-mpip安装libusb),但是错误消息仍然存在。另外,上面关于安装libusb-win32的建议对我也不起作用;这两个链接(原始帖子和@beebek的答案)都不存在 然而,起作用的是@user1495323的评论:我从中复制了
libusb-1.0.dll
C:\Users\username\AppData\Roaming\Python27\site packages\libusb\\u platform\\u windows\x64\
对于
C:\Windows\System32\
有一个更简单的解决方案
从下载并解压缩到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\u 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()
这个方法对我很有用。libusb后端是由/usb路径中的python脚本通过从Windows路径加载二进制DLL来初始化的,如果zadig的虚拟DLL丢失或安装了二进制DLL,它会对此抱怨。因为zadig安装的DLL不会将任何符号导出到外部WORD(我猜是虚拟的)考虑到这是关于XP的(OP要求回复:Windows 7),作为一个注释,这可能会更好。我将当前文件夹添加到
路径
。这就是诀窍!需要将libusb-1.0.dll放入system32目录。确保它适合您的系统(32位或64位)是的,运行inf向导并选择要启动的设备。@Jonicanada我似乎遇到了与Garrett Hyde相同的问题。但不同的是,我下载并解压缩了文件(libusb1.0.20),然后复制了一个dll文件,指定
pip install libusb