关于Pyinstaller闪退的补救措施

关于Pyinstaller闪退的补救措施,我们可以从以下几方面入手:

1. 使用Pyinstaller命令行参数

Pyinstaller是一款将Python代码打包成独立可执行文件的工具,通常情况下,使用 -F 参数即可将代码打包成单个可执行文件。但是,如果你的代码中使用了某些第三方库或资源文件,那么就需要使用一些额外的参数来指定这些文件,并将其打包进可执行文件中。

例如,我们有一个使用了PyQT5库的Python脚本,我们需要将这个脚本打包成一个可执行文件:

pyinstaller -F --hidden-import PyQt5 myscript.py

其中,--hidden-import 参数可以用来指定需要隐式导入的模块,这里我们需要隐式导入PyQT5库。可以根据实际情况进行适当的调整。

2. 使用Pyinstaller hooks文件

Pyinstaller hooks文件是用来告诉Pyinstaller如何处理一些第三方库的文件,例如DLL动态链接库、资源文件等。Pyinstaller提供了一些默认的hooks文件,但是有时候某些第三方库可能并没有被正确处理,导致程序运行时会闪退。

解决这个问题的方法是:自己编写一个针对该第三方库的hooks文件,并放在Pyinstaller hooks文件夹中。具体方法如下:

以PyQT5为例,我们假定我们的程序使用了Qt的WebEngine模块,并且在使用过程中会出现闪退的情况。这时我们就可以创建一个名为hook-QtWebEngine.py的文件,并在其中添加以下内容:

from PyInstaller.utils.hooks import collect_all

def hook(hook_api):
    packages = []
    for package in ('PyQt5.QtWebEngineWidgets', 'PyQt5.QtWebEngineCore'):
        packages.extend(collect_all(package))
    datas, binaries, hiddenimports = hook_api.collect_bins(
        packages, include_py_files=False)

    return {
        'datas': datas,
        'binaries': binaries,
        'hiddenimports': hiddenimports
    }

这段代码会告诉Pyinstaller:对于PyQt5.QtWebEngineWidgets和PyQt5.QtWebEngineCore两个模块,需要将其相关的资源文件(如DLL库文件)打包进可执行文件中。这样,在使用Pyinstaller打包程序时,就会自动加载我们编写的hooks文件,并正确处理该第三方库相关的文件。

示例说明:

  1. 示例一:使用Pyinstaller命令行参数

假设我们有一个使用了Pillow库的简单Python脚本:

from PIL import Image

if __name__ == '__main__':
    im = Image.open('example.png')
    im.show()

我们将其保存为文件名为pillowtest.py的文件。现在我们使用命令行进行打包:

pyinstaller -F --hidden-import PIL pillowtest.py

其中,-F 表示将代码打包成单个可执行文件,--hidden-import PIL表示将Pillow库打包进可执行文件中。打包成功后,我们可以在dist文件夹中找到一个名为pillowtest的可执行文件,运行它应该会成功地显示图像。

  1. 示例二:使用Pyinstaller hooks文件

假设我们有一个使用了wxPython库的Python脚本:

import wx

if __name__ == '__main__':
    app = wx.App()
    frame = wx.Frame(None, -1, 'Hello, wxPython!', size=(400, 300))
    panel = wx.Panel(frame)
    text = wx.StaticText(panel, -1, 'Hello, wxPython!', pos=(100, 100))
    frame.Centre()
    frame.Show()
    app.MainLoop()

我们将其保存为文件名为wxtest.py的文件。现在我们使用命令行进行打包:

pyinstaller -F wxtest.py

由于wxPython库并不能被Pyinstaller默认处理,因此在运行生成的可执行文件时,会出现闪退的情况。我们可以自己写一个hooks文件来处理这个问题:

在Pyinstaller安装目录下的hooks文件夹中新建一个名为hook-wx.py的文件,并添加以下内容:

from PyInstaller.utils.hooks import collect_submodules

hiddenimports = collect_submodules('wx')

这个hooks文件告诉Pyinstaller,wxPython库由许多子模块组成,需要把这些子模块全部导入。保存文件后,再次运行Pyinstaller,但是不再需要指定--hidden-import参数:

pyinstaller -F wxtest.py

打包成功后,我们可以在dist文件夹中找到一个名为wxtest的可执行文件,运行它即可看到窗口的正常显示。

本文链接:http://task.lmcjl.com/news/17455.html

展开阅读全文