pyinstaller打包运行报错failed to execute script main

最近使用PyQT5开发一个桌面应用程序,单独运行没有问题,但是使用打包工具pyinstaller打包后,却弹出窗口,提示“failed to execute script main”。
pyinstaller的版本为最新,python为V3.7,配合QT版本5.3

问题现象

使用pyinstaller打包后,运行exe就会提示错误,“failed to execute script main”。但是代码本地调是没有问题的。如图

解决办法

这个问题,我经过百度,也没找到最终的解决办法。最后通过自己的尝试,最终解决问题。现在总结一下遇到这类问题应如何处理,以免日后再次掉坑里。
可根据以下列举项进行排查:

排查1,是不是打包过程中出问题

如果打包过程中,本身就出错了,那即使生成了可执行文件,肯定也不能运用。因此,注意检查一下,打包的log。
如何检查呢?一种是通过查看打包命令的回显,另外也可以在打包生成的文件夹里查看,有个html格式的文件会记录打包过程的log。
打包过程中,常见的错误有:

  • ImportError: C extension: No module named *
    这类问题,可以增加--hidden-import 选项进行屏蔽。
  • 代码目录结构不合理,打包时出错

排查2,代码本身有问题

主要是路径的问题。例如:脚本中需要在当前路径下创建文件夹/文件。
这个问题,我们首相想到的就是通过打印,查看错误原因,进而做相应的适配与修改,解决问题。
那么,在打包时,打包命令就要将-w去掉,增加-f的选项,-w就是不带console窗口,而-f就是带console窗口,并会将执行的log打印。这个正合我意。
好了,按照这个,一步一步尝试,最终定会成功,GUI界面终于打开是不是很激动。

深入思考

之前没深入研究过打包工具pyinstaller,只是会使用。那具体这个工具都提供哪些参数呢,整理一下

pyinstaller相关参数

  参数 描述
1 -F, –onefile 打包一个单个文件,如果你的代码都写在一个.py文件的话,可以用这个,如果是多个.py文件就别用
2 -D, –onedir 打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码,我个人比较推荐这样,代码易于维护
3 -K, –tk 在部署时包含 TCL/TK
4 -a, –ascii 不包含编码.在支持Unicode的python版本上默认包含所有的编码.
5 -d, –debug 产生debug版本的可执行文件
6 -w,–windowed,–noconsole 使用Windows子系统执行.当程序启动的时候不会打开命令行(只对Windows有效)
7 -c,–nowindowed,–console 使用控制台子系统执行(默认)(只对Windows有效)
8 -s,–strip 可执行文件和共享库将run through strip.注意Cygwin的strip往往使普通的win32 Dll无法使用.
9 -X, –upx 如果有UPX安装(执行Configure.py时检测),会压缩执行文件(Windows系统中的DLL也会)(参见note)
10 -o DIR, –out=DIR 指定spec文件的生成目录,如果没有指定,而且当前目录是PyInstaller的根目录,会自动创建一个用于输出(spec和生成的可执行文件)的目录.如果没有指定,而当前目录不是PyInstaller的根目录,则会输出到当前的目录下.
11 -p DIR, –path=DIR 设置导入路径(和使用PYTHONPATH效果相似).可以用路径分割符(Windows使用分号,Linux使用冒号)分割,指定多个目录.也可以使用多个-p参数来设置多个导入路径,让pyinstaller自己去找程序需要的资源
12 –icon= 将file.ico添加为可执行文件的资源(只对Windows系统有效),改变程序的图标 pyinstaller -i ico路径 xxxxx.py
13 –icon= 将file.exe的第n个图标添加为可执行文件的资源(只对Windows系统有效)
14 -v FILE, –version=FILE 将verfile作为可执行文件的版本资源(只对Windows系统有效)
15 -n NAME, –name=NAME 可选的项目(产生的spec的)名字.如果省略,第一个脚本的主文件名将作为spec的名字

你可能感兴趣的:(程序人生)