python pyusb 打包exe 报错

来源:1 2 两个解决方式一样。

背景

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

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

20220526 解决了我的问题。

其他解决方案:
https://blog.csdn.net/qq_36272641/article/details/86244596
https://blog.csdn.net/jjinl/article/details/122433785

你可能感兴趣的:(python pyusb 打包exe 报错)