网站首页 文章专栏 usb.core NoBackendError, pyinstaller
usb.core NoBackendError, pyinstaller
创建于:2018-09-28 16:00:00 更新于:2024-11-25 06:47:11 羽瀚尘 4980
python 干货,python,pyinstaller,pyusb,backend

背景

在调试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'],
    ...

重要的修改项是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