python打包成.exe可执行文件之后常常出现双击之后闪退的情况,而闪退的时候更是无从知道问题出在哪,在网上搜索程序闪退的解决方案的时候诸多尝试有时可以解决问题又是又不可以,根据笔者的血泪尝试,总结如下:

1、第一种情况:程序正常运行,运行结束之后控制台自动退出

此时如果想看到控制台输出的内容,可以考虑在源代码中增加

在源程序中加入用户输入字符后结束程序:input("输入任意字符结束")、或者添加raw_input()或者os.system("pause")等待信息 ;

或者让程序睡眠等待time.sleep(10)

2、第二种情况:程序存在问题,无法正常运行

此种情况下,可能出现的原因有很多种,根据个人的程序而存在着不同的原因。现在最关键的是找到究竟问题出在哪,然后对症下药检索

使用 pyinstaller -F 待打包文件名.py –noconsole(注意:noconsole前面必须是两个  -  -,一个 - 不起作用)

去掉弹出的命令行提示窗口,这样在双击运行之后,如果是程序有问题就会出现报错弹框(如下所示),然后就可以根据上面的报错去debug啦

常见问题(我遇到的):

a、程序中使用到的外部文件的引用路径与.exe的相对位置与程序中的不同,使得引用的资源文件丢失:

你编译成.exe的python程序中导入了其他类型的资源文件(如.xml,.ini等等)。生成的.exe文件与你导入的文件不在同一文件夹内导致无法运行。而生成的.exe文件在dist文件夹中,虽然在同一工程内,可是不是在同一文件夹下,然而源程序中导入你所写的模块默认是在当前文件夹下的,所以所以所以!.exe文件在运行的时候找!不!到!导入的模块!故而不能执行!解决办法就是把.exe文件抬到所导入模块所在的文件夹内就可以了。当然也可以把导入的模块搬到.exe文件所在的文件夹下,同一个道理的。

b、程序中引用的某些包在打包的时候出现问题,导致包的缺失

如,我曾经在引用了消息弹窗的程序的.exe中遇到报错:moudle 'pywintypes' is not in frozen sys.path,经过检索轻松找到解决方案

python3.8+pyinstaller调试正常,打包后运行失败(Module‘puwintypes’isn't in frozen sys.path) - CYCYCYCYCY - 博客园

c、本地存在多个版本的python,打包成.exe程序的时候使用了与被打包程序不匹配的python对应的pyinstaller,导致打包之后的程序缺少了依赖的包

后面遇到了与上述b相似类型的报错(都是包的问题)ModuleNotFoundError:No module named 'watchdog'(详见上图),但是通过艰辛耗时巨久的检索尝试了很多别人的解决方案还是不管用,最终发现了是本地使用了多个版本的python,在打包的时候没有区分好,使用了错误的python版本中的pyinstaller导致的。

详见我的另外一篇博客:

python程序打包成.exe 文件报错ModuleNotFoundError:No module named ‘watchdog‘ 解决方案

相信通过以上的方法,就可以解决绝大多数(可能还有我没有遇到的情况,遇到了会继续更新)的闪退问题啦~

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐