usb.core NoBackendError, pyinstaller

背景

在调试pyusb时,发现直接python scripts.py可以正常运行,但是打包成exe, 即经过了
pyinstaller -F scripts.py ./scripts.exe运行就失败,提示错误是
usb.core.NoBackendError: No backend available.

1
2
3
4
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后出现):

1
2
3
4
5
6
7
8
9
10
binaries = [
('C:\\Windows\\System32\\libusb0.dll', '.'),
]
a = Analysis(['myscript.py'],
...
binaries=binaries,
datas=[],
hiddenimports=['usb'],
...

重要的修改项是binarieshiddenimports.后续再打包时,直接指定该.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

0%