网站首页 文章专栏 usb.core NoBackendError, pyinstaller
在调试pyusb时,发现直接python scripts.py
可以正常运行,但是打包成exe, 即经过了
pyinstaller -F scripts.py ./scripts.exe
运行就失败,提示错误是
usb.core.NoBackendError: No backend available
.
Traceback (most recent call last): File "<string>", line 3, in <module> File "site-packages\usb\core.py", line 1263, in find usb.core.NoBackendError: No backend available
在这里找到了解决方案.
原因在于pyinstaller
没有把一些外部的库包含进来,导致报错。一个可行的解决方案如下:
将.spec修改至如下所示(.spec文件会在第一次运行pyinstaller后出现):
binaries = [ ('C:\\Windows\\System32\\libusb0.dll', '.'), ] a = Analysis(['myscript.py'], ... binaries=binaries, datas=[], hiddenimports=['usb'], ...
重要的修改项是binaries
和hiddenimports
.后续再打包时,直接指定该.spec文件即可。
这里出现的错误NoBackendError
实际上是由于pyusb
无法找到libusb*.dll
引起的。手动将DLL复制到dist /project文件夹修复了该问题,应用程序将按预期工作。 但是我们当然不能以这种方式构建打包exe文件,我们希望能够自动化解决该问题。
看看hook-usb.py
,似乎hook打算将DLL添加到二进制文件中,但实际上没有这样做,因为我们的目标DLL安装在C:\Windows\System32
,而WinExcludeList
排除了C:\Windows
下面的所有内容。 在_resolveCtypesImports()``(hook-usb.py第45行)
中找到正确的路径后,该排除路径生效,它通过dylib.py
中的include_library()
使用WinExcludeList
。