背景
在调试pyusb时,发现直接python scripts.py
可以正常运行,但是打包成exe, 即经过了
pyinstaller -F scripts.py ./scripts.exe
运行就失败,提示错误是
usb.core.NoBackendError: No backend available
.
Traceback (most recent call last):
File "pydfu.py", line 1029, in run
File "pydfu.py", line 459, in get_dfu_devices
File "usb\core.py", line 1309, 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
。
20220526 解决了我的问题。
其他解决方案:
https://blog.csdn.net/qq_36272641/article/details/86244596
https://blog.csdn.net/jjinl/article/details/122433785